Skip to content

Commit 57c2b3a

Browse files
committed
test/ns_perf: add NS to NS performance test
This commit adds a simple NS to NS performance test to locally replicate the more complex CNI performance test.
1 parent cc88f87 commit 57c2b3a

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed

test/ns_perf/Makefile

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
SHELL=/bin/bash
2+
3+
ifeq ($(DEBUG),1)
4+
DEBUG := 1
5+
else
6+
DEBUG := 0
7+
endif
8+
9+
ifeq ($(VERBOSE),1)
10+
QUIET :=
11+
else
12+
QUIET := @
13+
endif
14+
15+
ifeq ($(PROTO),udp)
16+
PROTO := udp
17+
IPERF_OPTS := -u -l 1430 -b 100G
18+
else
19+
PROTO := tcp
20+
endif
21+
22+
ifeq ($(FUN_PROTO),udp)
23+
FUN_PROTO := udp
24+
else
25+
FUN_PROTO := tcp
26+
endif
27+
28+
CLANG ?= clang
29+
MTU := 1500
30+
31+
all: check
32+
check: _setup _load
33+
34+
##
35+
## Test scenario
36+
#
37+
# NS1 NS2
38+
# ........... ............
39+
# . ----- . ----- ----- . ----- .
40+
# . |veth0|<-->|veth1| |veth2|<-->|veth3| .
41+
# . ----- . ----- ----- . ----- .
42+
# ........... ............
43+
#
44+
45+
RULES_SVC_EGRESS := "ip $(PROTO) sport 8080 actions funnel $(FUN_PROTO) sport 80 dport 540"
46+
RULES_SVC_INGRESS := "ip $(FUN_PROTO) dport 80 sport 540 actions unfunnel $(PROTO)"
47+
48+
RULES_INGRESS := "ip $(FUN_PROTO) sport 80 dport 540 actions unfunnel $(PROTO)"
49+
RULES_EGRESS := "ip $(PROTO) dport 8080 actions funnel $(FUN_PROTO) sport 540 dport 80"
50+
51+
_setup:
52+
$(QUIET)echo -n "Creating ifaces..."
53+
$(QUIET)sudo ip link add type veth
54+
$(QUIET)sudo ip link add type veth
55+
$(QUIET)echo "OK"
56+
$(QUIET)echo -n "Creating ns1, ns2..."
57+
$(QUIET)sudo ip netns add ns1
58+
$(QUIET)sudo ip netns add ns2
59+
$(QUIET)echo "OK"
60+
$(QUIET)echo -n "Moving: eth0=>ns1, eth3=>n2..."
61+
$(QUIET)sudo ip link set netns ns1 dev veth0
62+
$(QUIET)sudo ip link set netns ns2 dev veth3
63+
$(QUIET)echo "OK"
64+
$(QUIET)echo -n "Bringing them up..."
65+
$(QUIET)sudo ip link set up dev veth1
66+
$(QUIET)sudo ip link set up dev veth2
67+
$(QUIET)sudo ip netns exec ns1 ip link set up dev lo
68+
$(QUIET)sudo ip netns exec ns2 ip link set up dev lo
69+
$(QUIET)sudo ip netns exec ns1 ip link set up dev veth0
70+
$(QUIET)sudo ip netns exec ns2 ip link set up dev veth3
71+
$(QUIET)echo "OK"
72+
$(QUIET)echo -n "Setting MTU..."
73+
$(QUIET)sudo ip netns exec ns1 ip link set mtu $(MTU) dev veth0
74+
$(QUIET)sudo ip link set mtu $(MTU) dev veth1
75+
$(QUIET)sudo ip link set mtu $(MTU) dev veth2
76+
$(QUIET)sudo ip netns exec ns2 ip link set mtu $(MTU) dev veth3
77+
$(QUIET)echo "OK"
78+
$(QUIET)echo -n "Add IP addresses..."
79+
$(QUIET)sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth0
80+
$(QUIET)sudo ip addr add 10.0.0.2/24 dev veth1
81+
$(QUIET)sudo ip addr add 10.0.1.1/24 dev veth2
82+
$(QUIET)sudo ip netns exec ns2 ip addr add 10.0.1.2/24 dev veth3
83+
$(QUIET)echo "OK"
84+
$(QUIET)echo -n "Add default routes to NSs..."
85+
$(QUIET)sudo ip netns exec ns1 ip route add default via 10.0.0.2
86+
$(QUIET)sudo ip netns exec ns2 ip route add default via 10.0.1.1
87+
$(QUIET)echo "OK"
88+
$(QUIET)echo -n "Open the firewall..."
89+
$(QUIET)sudo iptables -I FORWARD -d 10.0.0.0/8 -j ACCEPT
90+
$(QUIET)echo "OK"
91+
$(QUIET)echo -n "Disable RPF filters..."
92+
$(QUIET)sudo ip netns exec ns1 sysctl -q net.ipv4.conf.veth0.rp_filter=0
93+
$(QUIET)sudo sysctl -q net.ipv4.conf.veth1.rp_filter=0
94+
$(QUIET)sudo sysctl -q net.ipv4.conf.veth2.rp_filter=0
95+
$(QUIET)sudo ip netns exec ns2 sysctl -q net.ipv4.conf.veth3.rp_filter=0
96+
$(QUIET)echo "OK"
97+
$(QUIET)echo -n "Test base setup..."
98+
$(QUIET)sudo ip netns exec ns1 ping -c 1 10.0.1.2 > /dev/null
99+
$(QUIET)echo "OK"
100+
101+
_compile:
102+
$(QUIET)cd ../../docker && make
103+
104+
_load: _compile
105+
$(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns1 -e IFACES=veth0 -e SFUNNEL_RULESET=$(RULES_EGRESS) -e DIRECTION=egress -e DEBUG=$(DEBUG) sfunnel
106+
$(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns1 -e IFACES=veth0 -e SFUNNEL_RULESET=$(RULES_INGRESS) -e DIRECTION=ingress -e DEBUG=$(DEBUG) sfunnel
107+
$(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns2 -e IFACES=veth3 -e SFUNNEL_RULESET=$(RULES_SVC_EGRESS) -e DIRECTION=egress -e DEBUG=$(DEBUG) sfunnel
108+
$(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns2 -e IFACES=veth3 -e SFUNNEL_RULESET=$(RULES_SVC_INGRESS) -e DIRECTION=ingress -e DEBUG=$(DEBUG) sfunnel
109+
110+
_unload:
111+
$(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns1 -e CLEAN=1 -e DEBUG=1 -e DIRECTION=both sfunnel
112+
$(QUIET)docker run --privileged --network=host -v /var/run/netns:/var/run/netns -i -e NETNS=ns2 -e CLEAN=1 -e DEBUG=1 -e DIRECTION=both sfunnel
113+
114+
115+
_clean_iperf:
116+
$(QUIET)sudo ip netns exec ns1 killall iperf || true
117+
$(QUIET)sudo ip netns exec ns2 killall iperf || true
118+
119+
# No DNAT/SNAT
120+
check_perf_calibration:
121+
$(QUIET)sudo ip netns exec ns2 iperf -s -p 80 $(IPERF_OPTS) &
122+
$(QUIET)sudo ip netns exec ns1 iperf -c 10.0.1.2 -p 80 $(IPERF_OPTS)
123+
$(QUIET) $(MAKE) _clean_iperf
124+
check_perf:
125+
$(QUIET)sudo ip netns exec ns2 iperf -s -p 8080 $(IPERF_OPTS) &
126+
$(QUIET)sudo ip netns exec ns1 iperf -c 10.0.1.2 -p 8080 $(IPERF_OPTS)
127+
$(QUIET) $(MAKE) _clean_iperf
128+
129+
# DNAT only
130+
_clean_dnat:
131+
$(QUIET)sudo iptables -t nat -D PREROUTING -s 10.0.0.1 -d 10.0.1.3 -j DNAT --to-destination 10.0.1.2 || true
132+
$(QUIET)sudo iptables -t nat -D POSTROUTING -s 10.0.1.2 -d 10.0.0.1 -j SNAT --to-source 10.0.1.3 || true
133+
_add_dnat:
134+
$(QUIET)echo -n "Add DNAT..."
135+
$(QUIET)sudo iptables -t nat -I PREROUTING -s 10.0.0.1 -d 10.0.1.3 -j DNAT --to-destination 10.0.1.2
136+
$(QUIET)sudo iptables -t nat -I POSTROUTING -s 10.0.1.2 -d 10.0.0.1 -j SNAT --to-source 10.0.1.3
137+
$(QUIET)echo "OK"
138+
check_perf_calibration_dnat: _add_dnat
139+
$(QUIET)sudo ip netns exec ns2 iperf -s -p 80 $(IPERF_OPTS) &
140+
$(QUIET)sudo ip netns exec ns1 iperf -c 10.0.1.3 -p 80 $(IPERF_OPTS)
141+
$(QUIET) $(MAKE) _clean_dnat
142+
$(QUIET) $(MAKE) _clean_iperf
143+
check_perf_dnat: _add_dnat
144+
$(QUIET)sudo ip netns exec ns2 iperf -s -p 8080 $(IPERF_OPTS) &
145+
$(QUIET)sudo ip netns exec ns1 iperf -c 10.0.1.3 -p 8080 $(IPERF_OPTS)
146+
$(QUIET) $(MAKE) _clean_dnat
147+
$(QUIET) $(MAKE) _clean_iperf
148+
149+
clean: _clean_dnat _clean_iperf
150+
$(QUIET)sudo iptables -D FORWARD -d 10.0.0.0/8 -j ACCEPT || true
151+
$(QUIET)sudo ip link del veth1 || true
152+
$(QUIET)sudo ip link del veth2 || true
153+
$(QUIET)sudo ip netns del ns1 || true
154+
$(QUIET)sudo ip netns del ns2 || true

0 commit comments

Comments
 (0)