From f94adb121afcf7d5b3cc300fccbdf2247a907f63 Mon Sep 17 00:00:00 2001
From: David Gibson <david@gibson.dropbear.id.au>
Date: Mon, 6 Nov 2023 18:08:30 +1100
Subject: test/perf: Explicitly control UDP packet length, instead of MTU

Packet size can make a big difference to UDP throughput, so it makes sense
to measure it for a variety of different sizes.  Currently we do this by
adjusting the MTU on the relevant interface before running iperf3.

However, the UDP packet size has no inherent connection to the MTU - it's
controlled by the sender, and the MTU just affects whether the packet will
make it through or be fragmented.  The only reason adjusting the MTU works
is because iperf3 bases its default packet size on the (path) MTU.

We can test this more simply by using the -l option to the iperf3 client
to directly control the packet size, instead of adjusting the MTU.

As well as simplifying this lets us test different packet sizes for host to
ns traffic.  We couldn't do that previously because we don't have
permission to change the MTU on the host.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
---
 test/perf/passt_udp |  69 +++++++++++++-----------------------
 test/perf/pasta_udp | 100 ++++++++++++++++++++++++++--------------------------
 2 files changed, 75 insertions(+), 94 deletions(-)

diff --git a/test/perf/passt_udp b/test/perf/passt_udp
index 12d8fbb..10f638f 100644
--- a/test/perf/passt_udp
+++ b/test/perf/passt_udp
@@ -39,24 +39,21 @@ info	Throughput in Gbps, latency in µs, __THREADS__ threads at __FREQ__ GHz, on
 
 report	passt udp __THREADS__ __FREQ__
 
-th	MTU 256B 576B 1280B 1500B 9000B 65520B
+th	pktlen 256B 576B 1280B 1500B 9000B 65520B
 
 tr	UDP throughput over IPv6: guest to host
 iperf3s	ns 100${i}2 __THREADS__
+# (datagram size) = (packet size) - 48: 40 bytes of IPv6 header, 8 of UDP header
 
 bw	-
 bw	-
-guest	ip link set dev __IFNAME__ mtu 1280
-iperf3	BW guest __GW6__%__IFNAME__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 2G
+iperf3	BW guest __GW6__%__IFNAME__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 2G -l 1232
 bw	__BW__ 0.8 1.2
-guest	ip link set dev __IFNAME__ mtu 1500
-iperf3	BW guest __GW6__%__IFNAME__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW guest __GW6__%__IFNAME__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G -l 1452
 bw	__BW__ 1.0 1.5
-guest	ip link set dev __IFNAME__ mtu 9000
-iperf3	BW guest __GW6__%__IFNAME__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 5G
+iperf3	BW guest __GW6__%__IFNAME__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 5G -l 8952
 bw	__BW__ 4.0 5.0
-guest	ip link set dev __IFNAME__ mtu 65520
-iperf3	BW guest __GW6__%__IFNAME__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 7G
+iperf3	BW guest __GW6__%__IFNAME__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 7G -l 64372
 bw	__BW__ 4.0 5.0
 
 iperf3k	ns
@@ -74,24 +71,19 @@ lat	__LAT__ 200 150
 
 tr	UDP throughput over IPv4: guest to host
 iperf3s	ns 100${i}2 __THREADS__
+# (datagram size) = (packet size) - 28: 20 bytes of IPv4 header, 8 of UDP header
 
-guest	ip link set dev __IFNAME__ mtu 256
-iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 500M
+iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 500M -l 228
 bw	__BW__ 0.0 0.0
-guest	ip link set dev __IFNAME__ mtu 576
-iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 1G
+iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 1G -l 548
 bw	__BW__ 0.4 0.6
-guest	ip link set dev __IFNAME__ mtu 1280
-iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 2G
+iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 2G -l 1252
 bw	__BW__ 0.8 1.2
-guest	ip link set dev __IFNAME__ mtu 1500
-iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G -l 1472
 bw	__BW__ 1.0 1.5
-guest	ip link set dev __IFNAME__ mtu 9000
-iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 6G
+iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 6G -l 8972
 bw	__BW__ 4.0 5.0
-guest	ip link set dev __IFNAME__ mtu 65520
-iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 7G
+iperf3	BW guest __GW__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 7G -l 65492
 bw	__BW__ 4.0 5.0
 
 iperf3k	ns
@@ -109,20 +101,17 @@ lat	__LAT__ 200 150
 
 tr	UDP throughput over IPv6: host to guest
 iperf3s	guest 100${i}1 __THREADS__
+# (datagram size) = (packet size) - 48: 40 bytes of IPv6 header, 8 of UDP header
 
 bw	-
 bw	-
-ns	ip link set dev lo mtu 1280
-iperf3	BW ns ::1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 2G
+iperf3	BW ns ::1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 2G -l 1232
 bw	__BW__ 0.8 1.2
-ns	ip link set dev lo mtu 1500
-iperf3	BW ns ::1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 2G
+iperf3	BW ns ::1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 2G -l 1452
 bw	__BW__ 1.0 1.5
-ns	ip link set dev lo mtu 9000
-iperf3	BW ns ::1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns ::1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G -l 8952
 bw	__BW__ 3.0 4.0
-ns	ip link set dev lo mtu 65520
-iperf3	BW ns ::1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns ::1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G -l 64372
 bw	__BW__ 3.0 4.0
 
 iperf3k	guest
@@ -137,30 +126,23 @@ guestb	udp_rr --nolog -P 10001 -C 10011 -6
 sleep	1
 nsout	LAT udp_rr --nolog -P 10001 -C 10011 -6 -c -H ::1 | sed -n 's/^throughput=\(.*\)/\1/p'
 lat	__LAT__ 200 150
-ns	ip link set dev lo mtu 65535
 
 
 tr	UDP throughput over IPv4: host to guest
 iperf3s	guest 100${i}1 __THREADS__
+# (datagram size) = (packet size) - 28: 20 bytes of IPv4 header, 8 of UDP header
 
-ns	ip link set dev lo mtu 256
-iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 1G
+iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 1G -l 228
 bw	__BW__ 0.0 0.0
-ns	ip link set dev lo mtu 576
-iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 1G
+iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 1G -l 548
 bw	__BW__ 0.4 0.6
-ns	ip link set dev lo mtu 1280
-ns	ip addr add ::1 dev lo
-iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G -l 1252
 bw	__BW__ 0.8 1.2
-ns	ip link set dev lo mtu 1500
-iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G -l 1472
 bw	__BW__ 1.0 1.5
-ns	ip link set dev lo mtu 9000
-iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G -l 8972
 bw	__BW__ 3.0 4.0
-ns	ip link set dev lo mtu 65520
-iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns 127.0.0.1 100${i}1 __THREADS__ __TIME__ __OPTS__ -b 3G -l 65492
 bw	__BW__ 3.0 4.0
 
 iperf3k	guest
@@ -175,6 +157,5 @@ guestb	udp_rr --nolog -P 10001 -C 10011 -4
 sleep	1
 nsout	LAT udp_rr --nolog -P 10001 -C 10011 -4 -c -H 127.0.0.1 | sed -n 's/^throughput=\(.*\)/\1/p'
 lat	__LAT__ 200 150
-ns	ip link set dev lo mtu 65535
 
 te
diff --git a/test/perf/pasta_udp b/test/perf/pasta_udp
index 0628bd9..5e3db1e 100644
--- a/test/perf/pasta_udp
+++ b/test/perf/pasta_udp
@@ -29,23 +29,20 @@ info	Throughput in Gbps, latency in µs, one thread at __FREQ__ GHz, __STREAMS__
 
 report	pasta lo_udp 1 __FREQ__
 
-th	MTU 1500B 4000B 16384B 65535B
+th	pktlen 1500B 4000B 16384B 65535B
 
 
 tr	UDP throughput over IPv6: ns to host
 iperf3s	host 100${i}3 __THREADS__
+# (datagram size) = (packet size) - 48: 40 bytes of IPv6 header, 8 of UDP header
 
-ns	ip link set dev lo mtu 1500
-iperf3	BW ns ::1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns ::1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G -l 1452
 bw	__BW__ 1.0 1.5
-ns	ip link set dev lo mtu 4000
-iperf3	BW ns ::1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns ::1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G -l 3972
 bw	__BW__ 1.2 1.8
-ns	ip link set dev lo mtu 16384
-iperf3	BW ns ::1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 10G
+iperf3	BW ns ::1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 10G -l 16336
 bw	__BW__ 5.0 6.0
-ns	ip link set dev lo mtu 65535
-iperf3	BW ns ::1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 15G
+iperf3	BW ns ::1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 15G -l 65487
 bw	__BW__ 7.0 9.0
 
 iperf3k	host
@@ -62,18 +59,15 @@ lat	__LAT__ 200 150
 
 tr	UDP throughput over IPv4: ns to host
 iperf3s	host 100${i}3 __THREADS__
+# (datagram size) = (packet size) - 28: 20 bytes of IPv4 header, 8 of UDP header
 
-ns	ip link set dev lo mtu 1500
-iperf3	BW ns 127.0.0.1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns 127.0.0.1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G -l 1372
 bw	__BW__ 1.0 1.5
-ns	ip link set dev lo mtu 4000
-iperf3	BW ns 127.0.0.1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns 127.0.0.1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G -l 3972
 bw	__BW__ 1.2 1.8
-ns	ip link set dev lo mtu 16384
-iperf3	BW ns 127.0.0.1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 10G
+iperf3	BW ns 127.0.0.1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 10G -l 16356
 bw	__BW__ 5.0 6.0
-ns	ip link set dev lo mtu 65535
-iperf3	BW ns 127.0.0.1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 15G
+iperf3	BW ns 127.0.0.1 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 15G -l 65507
 bw	__BW__ 7.0 9.0
 
 iperf3k	host
@@ -91,10 +85,13 @@ lat	__LAT__ 200 150
 tr	UDP throughput over IPv6: host to ns
 iperf3s	ns 100${i}2 __THREADS__
 
-bw	-
-bw	-
-bw	-
-iperf3	BW host ::1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 15G
+iperf3	BW host ::1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G -l 1452
+bw	__BW__ 1.0 1.5
+iperf3	BW host ::1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G -l 3972
+bw	__BW__ 1.2 1.8
+iperf3	BW host ::1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 10G -l 16336
+bw	__BW__ 5.0 6.0
+iperf3	BW host ::1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 15G -l 16336
 bw	__BW__ 7.0 9.0
 
 iperf3k	ns
@@ -111,10 +108,13 @@ lat	__LAT__ 200 150
 
 tr	UDP throughput over IPv4: host to ns
 iperf3s	ns 100${i}2 __THREADS__
-bw	-
-bw	-
-bw	-
-iperf3	BW host 127.0.0.1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 15G
+iperf3	BW host 127.0.0.1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G -l 1372
+bw	__BW__ 1.0 1.5
+iperf3	BW host 127.0.0.1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G -l 3972
+bw	__BW__ 1.2 1.8
+iperf3	BW host 127.0.0.1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 10G -l 16356
+bw	__BW__ 5.0 6.0
+iperf3	BW host 127.0.0.1 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 15G -l 65507
 bw	__BW__ 7.0 9.0
 
 iperf3k	ns
@@ -141,22 +141,19 @@ nsout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifnam
 info	Throughput in Gbps, latency in µs, one thread at __FREQ__ GHz, __STREAMS__ streams
 report	pasta tap_udp 1 __FREQ__
 
-th	MTU 1500B 4000B 16384B 65520B
+th	pktlen 1500B 4000B 16384B 65520B
 
 tr	UDP throughput over IPv6: ns to host
 iperf3s	host 100${i}3 __THREADS__
+# (datagram size) = (packet size) - 48: 40 bytes of IPv6 header, 8 of UDP header
 
-ns	ip link set dev __IFNAME__ mtu 1500
-iperf3	BW ns __GW6__%__IFNAME__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 2G
+iperf3	BW ns __GW6__%__IFNAME__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 2G -l 1472
 bw	__BW__ 0.3 0.5
-ns	ip link set dev __IFNAME__ mtu 4000
-iperf3	BW ns __GW6__%__IFNAME__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns __GW6__%__IFNAME__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G -l 3972
 bw	__BW__ 0.5 0.8
-ns	ip link set dev __IFNAME__ mtu 16384
-iperf3	BW ns __GW6__%__IFNAME__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 4G
+iperf3	BW ns __GW6__%__IFNAME__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 4G -l 16356
 bw	__BW__ 3.0 4.0
-ns	ip link set dev __IFNAME__ mtu 65520
-iperf3	BW ns __GW6__%__IFNAME__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 6G
+iperf3	BW ns __GW6__%__IFNAME__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 6G -l 65472
 bw	__BW__ 6.0 7.0
 
 iperf3k	host
@@ -173,18 +170,15 @@ lat	__LAT__ 200 150
 
 tr	UDP throughput over IPv4: ns to host
 iperf3s	host 100${i}3 __THREADS__
+# (datagram size) = (packet size) - 28: 20 bytes of IPv4 header, 8 of UDP header
 
-ns	ip link set dev __IFNAME__ mtu 1500
-iperf3	BW ns __GW__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 2G
+iperf3	BW ns __GW__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 2G -l 1472
 bw	__BW__ 0.3 0.5
-ns	ip link set dev __IFNAME__ mtu 4000
-iperf3	BW ns __GW__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G
+iperf3	BW ns __GW__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 3G -l 3972
 bw	__BW__ 0.5 0.8
-ns	ip link set dev __IFNAME__ mtu 16384
-iperf3	BW ns __GW__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 4G
+iperf3	BW ns __GW__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 4G -l 16356
 bw	__BW__ 3.0 4.0
-ns	ip link set dev __IFNAME__ mtu 65520
-iperf3	BW ns __GW__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 6G
+iperf3	BW ns __GW__ 100${i}3 __THREADS__ __TIME__ __OPTS__ -b 6G -l 65492
 bw	__BW__ 6.0 7.0
 
 iperf3k	host
@@ -203,10 +197,13 @@ iperf3s	ns 100${i}2 __THREADS__
 
 nsout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
 nsout	ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[] | select(.scope == "global" and .prefixlen == 64).local'
-bw	-
-bw	-
-bw	-
-iperf3	BW host __ADDR6__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 15G
+iperf3	BW host __ADDR6__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 2G -l 1472
+bw	__BW__ 0.3 0.5
+iperf3	BW host __ADDR6__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G -l 3972
+bw	__BW__ 0.5 0.8
+iperf3	BW host __ADDR6__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 4G -l 16356
+bw	__BW__ 3.0 4.0
+iperf3	BW host __ADDR6__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 15G -l 65472
 bw	__BW__ 7.0 9.0
 
 iperf3k	ns
@@ -225,10 +222,13 @@ tr	UDP throughput over IPv4: host to ns
 iperf3s	ns 100${i}2 __THREADS__
 
 nsout	ADDR ip -j -4 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[0].local'
-bw	-
-bw	-
-bw	-
-iperf3	BW host __ADDR__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 15G
+iperf3	BW host __ADDR__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 2G -l 1472
+bw	__BW__ 0.3 0.5
+iperf3	BW host __ADDR__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 3G -l 3972
+bw	__BW__ 0.5 0.8
+iperf3	BW host __ADDR__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 4G -l 16356
+bw	__BW__ 3.0 4.0
+iperf3	BW host __ADDR__ 100${i}2 __THREADS__ __TIME__ __OPTS__ -b 15G -l 65492
 bw	__BW__ 7.0 9.0
 
 iperf3k	ns
-- 
cgit v1.2.3