From c204166dac6e9ee3c008b0983a66491de077793b Mon Sep 17 00:00:00 2001 From: Trevor Woerner Date: Thu, 27 Feb 2025 19:54:20 -0500 Subject: iperf3: throughput fix This is a backport of a fix to iperf3. The author saw a 40% improvement in their network throughput, we've seen around a 55% improvement in our tests. Link: https://github.com/esnet/iperf/pull/1708/commits/ac6b9f7fd335ddebc5212eed40083ef4cd3cb86d Signed-off-by: Trevor Woerner Signed-off-by: Armin Kuster --- .../do-not-listen-to-old-udp-prot-listener.patch | 30 ++++++++++++++++++++++ meta-oe/recipes-benchmark/iperf3/iperf3_3.16.bb | 1 + 2 files changed, 31 insertions(+) create mode 100644 meta-oe/recipes-benchmark/iperf3/iperf3/do-not-listen-to-old-udp-prot-listener.patch diff --git a/meta-oe/recipes-benchmark/iperf3/iperf3/do-not-listen-to-old-udp-prot-listener.patch b/meta-oe/recipes-benchmark/iperf3/iperf3/do-not-listen-to-old-udp-prot-listener.patch new file mode 100644 index 0000000000..da1664ddcf --- /dev/null +++ b/meta-oe/recipes-benchmark/iperf3/iperf3/do-not-listen-to-old-udp-prot-listener.patch @@ -0,0 +1,30 @@ +From ac6b9f7fd335ddebc5212eed40083ef4cd3cb86d Mon Sep 17 00:00:00 2001 +From: David Bar-On +Date: Sun, 2 Jun 2024 11:52:03 +0300 +Subject: [PATCH] Do not listen to old pro_listener + +Clear old UDP prot_listener from read_set, as currently the server's select() +always return when data (that is relevant only to the worker thread) is +received. This makes the main thread consume a lot of unnecessary CPU, which +reduces the total throughput - especially when only one stream is used. + +In my single machine environment, with the this fix the throughput is +increased by about 40% for one stream test. +--- +Upstream-Status: Backport [3.18] + + src/iperf_udp.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/iperf_udp.c b/src/iperf_udp.c +index a603236df..40f2b1ca7 100644 +--- a/src/iperf_udp.c ++++ b/src/iperf_udp.c +@@ -446,6 +446,7 @@ iperf_udp_accept(struct iperf_test *test) + /* + * Create a new "listening" socket to replace the one we were using before. + */ ++ FD_CLR(test->prot_listener, &test->read_set); // No control messages from old listener + test->prot_listener = netannounce(test->settings->domain, Pudp, test->bind_address, test->bind_dev, test->server_port); + if (test->prot_listener < 0) { + i_errno = IESTREAMLISTEN; diff --git a/meta-oe/recipes-benchmark/iperf3/iperf3_3.16.bb b/meta-oe/recipes-benchmark/iperf3/iperf3_3.16.bb index 5cec4c6874..a2cb903562 100644 --- a/meta-oe/recipes-benchmark/iperf3/iperf3_3.16.bb +++ b/meta-oe/recipes-benchmark/iperf3/iperf3_3.16.bb @@ -15,6 +15,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=dc6301c8256ceb8f71c9e3c2ae9096b9" SRC_URI = "git://github.com/esnet/iperf.git;branch=master;protocol=https \ file://0002-Remove-pg-from-profile_CFLAGS.patch \ file://0001-configure.ac-check-for-CPP-prog.patch \ + file://do-not-listen-to-old-udp-prot-listener.patch \ " SRCREV = "f9481e1cd35159929458513692e4a8f9fdd1bd6f" -- cgit v1.2.3-54-g00ecf