pktgen_sample03_burst_single_flow.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # Script for max single flow performance
  5. # - If correctly tuned[1], single CPU 10G wirespeed small pkts is possible[2]
  6. #
  7. # Using pktgen "burst" option (use -b $N)
  8. # - To boost max performance
  9. # - Avail since: kernel v3.18
  10. # * commit 38b2cf2982dc73 ("net: pktgen: packet bursting via skb->xmit_more")
  11. # - This avoids writing the HW tailptr on every driver xmit
  12. # - The performance boost is impressive, see commit and blog [2]
  13. #
  14. # Notice: On purpose generates a single (UDP) flow towards target,
  15. # reason behind this is to only overload/activate a single CPU on
  16. # target host. And no randomness for pktgen also makes it faster.
  17. #
  18. # Tuning see:
  19. # [1] http://netoptimizer.blogspot.dk/2014/06/pktgen-for-network-overload-testing.html
  20. # [2] http://netoptimizer.blogspot.dk/2014/10/unlocked-10gbps-tx-wirespeed-smallest.html
  21. #
  22. basedir=`dirname $0`
  23. source ${basedir}/functions.sh
  24. root_check_run_with_sudo "$@"
  25. # Parameter parsing via include
  26. source ${basedir}/parameters.sh
  27. # Set some default params, if they didn't get set
  28. if [ -z "$DEST_IP" ]; then
  29. [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1"
  30. fi
  31. [ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff"
  32. [ -z "$BURST" ] && BURST=32
  33. [ -z "$CLONE_SKB" ] && CLONE_SKB="0" # No need for clones when bursting
  34. [ -z "$COUNT" ] && COUNT="0" # Zero means indefinitely
  35. if [ -n "$DEST_IP" ]; then
  36. validate_addr${IP6} $DEST_IP
  37. read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP)
  38. fi
  39. if [ -n "$DST_PORT" ]; then
  40. read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
  41. validate_ports $UDP_DST_MIN $UDP_DST_MAX
  42. fi
  43. # Base Config
  44. DELAY="0" # Zero means max speed
  45. # General cleanup everything since last run
  46. pg_ctrl "reset"
  47. # Threads are specified with parameter -t value in $THREADS
  48. for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
  49. dev=${DEV}@${thread}
  50. # Add remove all other devices and add_device $dev to thread
  51. pg_thread $thread "rem_device_all"
  52. pg_thread $thread "add_device" $dev
  53. # Base config
  54. pg_set $dev "flag QUEUE_MAP_CPU"
  55. pg_set $dev "count $COUNT"
  56. pg_set $dev "clone_skb $CLONE_SKB"
  57. pg_set $dev "pkt_size $PKT_SIZE"
  58. pg_set $dev "delay $DELAY"
  59. pg_set $dev "flag NO_TIMESTAMP"
  60. # Destination
  61. pg_set $dev "dst_mac $DST_MAC"
  62. pg_set $dev "dst${IP6}_min $DST_MIN"
  63. pg_set $dev "dst${IP6}_max $DST_MAX"
  64. if [ -n "$DST_PORT" ]; then
  65. # Single destination port or random port range
  66. pg_set $dev "flag UDPDST_RND"
  67. pg_set $dev "udp_dst_min $UDP_DST_MIN"
  68. pg_set $dev "udp_dst_max $UDP_DST_MAX"
  69. fi
  70. # Setup burst, for easy testing -b 0 disable bursting
  71. # (internally in pktgen default and minimum burst=1)
  72. if [[ ${BURST} -ne 0 ]]; then
  73. pg_set $dev "burst $BURST"
  74. else
  75. info "$dev: Not using burst"
  76. fi
  77. done
  78. # Run if user hits control-c
  79. function control_c() {
  80. # Print results
  81. for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
  82. dev=${DEV}@${thread}
  83. echo "Device: $dev"
  84. cat /proc/net/pktgen/$dev | grep -A2 "Result:"
  85. done
  86. }
  87. # trap keyboard interrupt (Ctrl-C)
  88. trap control_c SIGINT
  89. echo "Running... ctrl^C to stop" >&2
  90. pg_ctrl "start"