From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 3C9EF5A0271 for ; Mon, 6 Nov 2023 08:08:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1699254520; bh=oen0TcOgDnya94ccbxMi07nR6MN+0V1AHZsKi0dMAMI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M5mzdWvIb3yhvGoc3ihrKjOHf16WQj2SqE9aa9EK3peUoQzSG0zTAlNBcejSZA3nx QQJXzJQAVefVng4SR7NB/YkFOUdUEJtrTG0C7DMTjBNCXJ75dsTq9aSwygnI88A98f GAFAW8Ygcx0FMUzB7HZizZqW/vpkLQYkWSC6YAbI= Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4SP2WX4ttpz4xWN; Mon, 6 Nov 2023 18:08:40 +1100 (AEDT) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH 2/8] test/perf: Get iperf3 stats from client side Date: Mon, 6 Nov 2023 18:08:27 +1100 Message-ID: <20231106070834.1270986-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231106070834.1270986-1-david@gibson.dropbear.id.au> References: <20231106070834.1270986-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: 4S6WLNOJY4422UCHCPKXTYSAMJZN4LBG X-Message-ID-Hash: 4S6WLNOJY4422UCHCPKXTYSAMJZN4LBG X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: iperf3 generates statistics about its run on both the client and server sides. They don't have exactly the same information, but both have the pieces we need (AFAICT the server communicates some nformation to the client over the control socket, so the most important information is in the client side output, even if measured by the server). Currently we use the server side information for our measurements. Using the client side information has several advantages though: * We can directly wait for the client to complete and we know we'll have the output we want. We don't need to sleep to give the server time to write out the results. * That in turn means we can wrap up as soon as the client is done, we don't need to wait overlong to make sure everything is finished. * The slightly different organisation of the data in the client output means that we always want the same json value, rather than requiring slightly different onces for UDP and TCP. The fact that we avoid some extra delays speeds up the overal run of the perf tests by around 7 minutes (out of around 35 minutes) on my laptop. The fact that we no longer unconditionally kill client and server after a certain time means that the client could run indefinitely if the server doesn't respond. We mitigate that by setting 1s connect timeout on the client. This isn't foolproof - if we get an initial response, but then lose connectivity this could still run indefinitely, however it does cover by far the most likely failure cases. --snd-timeout would provide more robustness, but I've hit odd failures when trying to use it. Signed-off-by: David Gibson --- .gitignore | 2 +- test/lib/test | 32 ++++++++++++++------------------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index d3d0e2c..d1c8be9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,5 @@ /qrap /pasta.1 /seccomp.h -/s*.json +/c*.json README.plain.md diff --git a/test/lib/test b/test/lib/test index 115dd21..3ca5dbc 100755 --- a/test/lib/test +++ b/test/lib/test @@ -31,41 +31,37 @@ test_iperf3() { __procs="$((${1} - 1))"; shift __time="${1}"; shift - pane_or_context_run "${__sctx}" 'rm -f s*.json' + pane_or_context_run "${__cctx}" 'rm -f c*.json' pane_or_context_run_bg "${__sctx}" \ 'for i in $(seq 0 '${__procs}'); do' \ - ' (iperf3 -s1J -p'${__port}' -i'${__time} \ - ' > s${i}.json) &' \ - ' echo $! > s${i}.pid &' \ + ' (iperf3 -s1 -p'${__port}' -i'${__time}') &' \ + ' echo $! > s${i}.pid; ' \ 'done' \ sleep 1 # Wait for server to be ready - pane_or_context_run_bg "${__cctx}" \ + # A 1s wait for connection on what's basically a local link + # indicates something is pretty wrong + __timeout=1000 + pane_or_context_run "${__cctx}" \ '(' \ ' for i in $(seq 0 '${__procs}'); do' \ - ' iperf3 -c '${__dest}' -p '${__port} \ - ' -t'${__time}' -i0 -T s${i} '"${@}"' &' \ + ' iperf3 -J -c '${__dest}' -p '${__port} \ + ' --connect-timeout '${__timeout} \ + ' -t'${__time}' -i0 -T c${i} '"${@}" \ + ' > c${i}.json &' \ ' done;' \ ' wait' \ ')' - sleep $((__time + 5)) - - # If client fails to deliver control message, tell server we're done + # Kill the server, just in case -1 didn't work right pane_or_context_run "${__sctx}" 'kill -INT $(cat s*.pid); rm s*.pid' - sleep 1 # ...and wait for output to be flushed - __jval=".end.sum_received.bits_per_second" - for __opt in ${@}; do - # UDP test - [ "${__opt}" = "-u" ] && __jval=".intervals[0].sum.bits_per_second" - done - __bw=$(pane_or_context_output "${__sctx}" \ - 'cat s*.json | jq -rMs "map('${__jval}') | add"') + __bw=$(pane_or_context_output "${__cctx}" \ + 'cat c*.json | jq -rMs "map('${__jval}') | add"') TEST_ONE_subs="$(list_add_pair "${TEST_ONE_subs}" "__${__var}__" "${__bw}" )" -- 2.41.0