forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pktgen: add sample script pktgen_sample03_burst_single_flow.sh
Add the pktgen samples script pktgen_sample03_burst_single_flow.sh that demonstrates how to acheive maximum performance. If correctly tuned[1] single CPU 10Gbit/s wirespeed small pkts is possible[2] which is 14.88Mpps. The trick is to take advantage of the "burst" feature introduced in commit 38b2cf2 ("net: pktgen: packet bursting via skb->xmit_more"). [1] http://netoptimizer.blogspot.dk/2014/06/pktgen-for-network-overload-testing.html [2] http://netoptimizer.blogspot.dk/2014/10/unlocked-10gbps-tx-wirespeed-smallest.html Signed-off-by: Jesper Dangaard Brouer <[email protected]> Signed-off-by: David S. Miller <[email protected]>
- Loading branch information
1 parent
282fb58
commit 1d73ba1
Showing
1 changed file
with
82 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
#!/bin/bash | ||
# | ||
# Script for max single flow performance | ||
# - If correctly tuned[1], single CPU 10G wirespeed small pkts is possible[2] | ||
# | ||
# Using pktgen "burst" option (use -b $N) | ||
# - To boost max performance | ||
# - Avail since: kernel v3.18 | ||
# * commit 38b2cf2982dc73 ("net: pktgen: packet bursting via skb->xmit_more") | ||
# - This avoids writing the HW tailptr on every driver xmit | ||
# - The performance boost is impressive, see commit and blog [2] | ||
# | ||
# Notice: On purpose generates a single (UDP) flow towards target, | ||
# reason behind this is to only overload/activate a single CPU on | ||
# target host. And no randomness for pktgen also makes it faster. | ||
# | ||
# Tuning see: | ||
# [1] http://netoptimizer.blogspot.dk/2014/06/pktgen-for-network-overload-testing.html | ||
# [2] http://netoptimizer.blogspot.dk/2014/10/unlocked-10gbps-tx-wirespeed-smallest.html | ||
# | ||
basedir=`dirname $0` | ||
source ${basedir}/functions.sh | ||
root_check_run_with_sudo "$@" | ||
|
||
# Parameter parsing via include | ||
source ${basedir}/parameters.sh | ||
# Set some default params, if they didn't get set | ||
[ -z "$DEST_IP" ] && DEST_IP="198.18.0.42" | ||
[ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff" | ||
[ -z "$BURST" ] && BURST=32 | ||
[ -z "$CLONE_SKB" ] && CLONE_SKB="100000" | ||
|
||
# Base Config | ||
DELAY="0" # Zero means max speed | ||
COUNT="0" # Zero means indefinitely | ||
|
||
# General cleanup everything since last run | ||
pg_ctrl "reset" | ||
|
||
# Threads are specified with parameter -t value in $THREADS | ||
for ((thread = 0; thread < $THREADS; thread++)); do | ||
dev=${DEV}@${thread} | ||
|
||
# Add remove all other devices and add_device $dev to thread | ||
pg_thread $thread "rem_device_all" | ||
pg_thread $thread "add_device" $dev | ||
|
||
# Base config | ||
pg_set $dev "flag QUEUE_MAP_CPU" | ||
pg_set $dev "count $COUNT" | ||
pg_set $dev "clone_skb $CLONE_SKB" | ||
pg_set $dev "pkt_size $PKT_SIZE" | ||
pg_set $dev "delay $DELAY" | ||
pg_set $dev "flag NO_TIMESTAMP" | ||
|
||
# Destination | ||
pg_set $dev "dst_mac $DST_MAC" | ||
pg_set $dev "dst $DEST_IP" | ||
|
||
# Setup burst, for easy testing -b 0 disable bursting | ||
# (internally in pktgen default and minimum burst=1) | ||
if [[ ${BURST} -ne 0 ]]; then | ||
pg_set $dev "burst $BURST" | ||
else | ||
info "$dev: Not using burst" | ||
fi | ||
done | ||
|
||
# Run if user hits control-c | ||
function control_c() { | ||
# Print results | ||
for ((thread = 0; thread < $THREADS; thread++)); do | ||
dev=${DEV}@${thread} | ||
echo "Device: $dev" | ||
cat /proc/net/pktgen/$dev | grep -A2 "Result:" | ||
done | ||
} | ||
# trap keyboard interrupt (Ctrl-C) | ||
trap control_c SIGINT | ||
|
||
echo "Running... ctrl^C to stop" >&2 | ||
pg_ctrl "start" |