Skip to content

Commit

Permalink
selftests: net/forwarding: spawn sh inside vrf to speed up ping loop
Browse files Browse the repository at this point in the history
Looking at timestamped output of netdev CI reveals that
most of the time in forwarding tests for custom route
hashing is spent on a single case, namely the test which
uses ping (mausezahn does not support flow labels).

On a non-debug kernel we spend 714 of 730 total test
runtime (97%) on this test case. While having flow label
support in a traffic gen tool / mausezahn would be best,
we can significantly speed up the loop by putting ip vrf exec
outside of the iteration.

In a test of 1000 pings using a normal loop takes 50 seconds
to finish. While using:

  ip vrf exec $vrf sh -c "$loop-body"

takes 12 seconds (1/4 of the time).

Some of the slowness is likely due to our inefficient virtualization
setup, but even on my laptop running "ip link help" 16k times takes
25-30 seconds, so I think it's worth optimizing even for fastest
setups.

Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Tested-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Hangbin Liu <liuhangbin@gmail.com>
Link: https://patch.msgid.link/20240817203659.712085-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Jakub Kicinski committed Aug 20, 2024
1 parent 7976538 commit 555e553
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -224,10 +224,10 @@ send_dst_ipv6()
send_flowlabel()
{
# Generate 16384 echo requests, each with a random flow label.
for _ in $(seq 1 16384); do
ip vrf exec v$h1 \
$PING6 2001:db8:4::2 -F 0 -c 1 -q >/dev/null 2>&1
done
ip vrf exec v$h1 sh -c \
"for _ in {1..16384}; do \
$PING6 2001:db8:4::2 -F 0 -c 1 -q >/dev/null 2>&1; \
done"
}

send_src_udp6()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -319,10 +319,10 @@ send_dst_ipv6()
send_flowlabel()
{
# Generate 16384 echo requests, each with a random flow label.
for _ in $(seq 1 16384); do
ip vrf exec v$h1 \
$PING6 2001:db8:2::2 -F 0 -c 1 -q >/dev/null 2>&1
done
ip vrf exec v$h1 sh -c \
"for _ in {1..16384}; do \
$PING6 2001:db8:2::2 -F 0 -c 1 -q >/dev/null 2>&1; \
done"
}

send_src_udp6()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -321,10 +321,10 @@ send_dst_ipv6()
send_flowlabel()
{
# Generate 16384 echo requests, each with a random flow label.
for _ in $(seq 1 16384); do
ip vrf exec v$h1 \
$PING6 2001:db8:2::2 -F 0 -c 1 -q >/dev/null 2>&1
done
ip vrf exec v$h1 sh -c \
"for _ in {1..16384}; do \
$PING6 2001:db8:2::2 -F 0 -c 1 -q >/dev/null 2>&1; \
done"
}

send_src_udp6()
Expand Down

0 comments on commit 555e553

Please sign in to comment.