pktgen_sample03_burst_single_flow.sh 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. # Base Config
  36. DELAY="0" # Zero means max speed
  37. # General cleanup everything since last run
  38. pg_ctrl "reset"
  39. # Threads are specified with parameter -t value in $THREADS
  40. for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
  41. dev=${DEV}@${thread}
  42. # Add remove all other devices and add_device $dev to thread
  43. pg_thread $thread "rem_device_all"
  44. pg_thread $thread "add_device" $dev
  45. # Base config
  46. pg_set $dev "flag QUEUE_MAP_CPU"
  47. pg_set $dev "count $COUNT"
  48. pg_set $dev "clone_skb $CLONE_SKB"
  49. pg_set $dev "pkt_size $PKT_SIZE"
  50. pg_set $dev "delay $DELAY"
  51. pg_set $dev "flag NO_TIMESTAMP"
  52. # Destination
  53. pg_set $dev "dst_mac $DST_MAC"
  54. pg_set $dev "dst$IP6 $DEST_IP"
  55. # Setup burst, for easy testing -b 0 disable bursting
  56. # (internally in pktgen default and minimum burst=1)
  57. if [[ ${BURST} -ne 0 ]]; then
  58. pg_set $dev "burst $BURST"
  59. else
  60. info "$dev: Not using burst"
  61. fi
  62. done
  63. # Run if user hits control-c
  64. function control_c() {
  65. # Print results
  66. for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
  67. dev=${DEV}@${thread}
  68. echo "Device: $dev"
  69. cat /proc/net/pktgen/$dev | grep -A2 "Result:"
  70. done
  71. }
  72. # trap keyboard interrupt (Ctrl-C)
  73. trap control_c SIGINT
  74. echo "Running... ctrl^C to stop" >&2
  75. pg_ctrl "start"