[ovs-dev] [PATCH 3/3] xlate: Always recirculate after an MPLS POP to a non-MPLS ethertype.
Jan Scheurich
jan.scheurich at ericsson.com
Wed Mar 23 14:31:45 UTC 2016
We have done a performance evaluation of the termination L3-VPN traffic (Phy --> VM) with MPLSoGRE encapsulation with and without recirculation to be able to quantify the performance impact of the above recent change.
OVS versions tested:
• branch-2.5 (74f1fc4d25fa8)
• master (87530bc1c1c)
• master (87530bc1c1c) plus reverted commit 8bf009bf8ab (always recirculate after pop_mpls)
All tests were performed on a dual socket Xeon E5-2680 v3 @ 2.50GHz. The system under test was OVS with DPDK-netdev datapath running on a single CPU core. The VPN traffic was generated on an external server and injected encapsulated through an Intel 82599 10G NIC. The traffic was terminated by DPDK testpmd in rxonly mode on a 4 core VM with 4 vhost-user ports. NIC, OVS and VM were all on the same CPU socket.
With the crucial commit 8bf009bf8ab (always recirculate after pop_mpls) the performance of MPLSoGRE decapsulation and forwarding drops to 1.4 Mpps, a reduction by 35% compared to current master (2.2 Mpps) and 39% compared to branch-2.5 (2.3 Mpps).
In our view a performance drop of 35% for this highly relevant use case in Cloud should be sufficient reason to re-consider the decision to simplify the code for recirculation after pop_mpls.
Best regards, Jan
Appendix: The details of the measured DPIF datapath:
root at dl380-668:~# appctl-25 dpif/show
netdev at ovs-netdev: hit:38333441319 missed:3547
br_int:
br_int 65534/13: (tap)
gre0 101/8: (gre: key=flow, remote_ip=10.1.2.9)
vhost811 11/1: (dpdkvhostuser: configured_rx_queues=1, configured_tx_queues=1, requested_tx_queues=49)
vhost812 12/6: (dpdkvhostuser: configured_rx_queues=1, configured_tx_queues=1, requested_tx_queues=49)
vhost813 13/9: (dpdkvhostuser: configured_rx_queues=1, configured_tx_queues=1, requested_tx_queues=49)
vhost814 14/7: (dpdkvhostuser: configured_rx_queues=1, configured_tx_queues=1, requested_tx_queues=49)
vhost815 15/10: (dpdkvhostuser: configured_rx_queues=1, configured_tx_queues=1, requested_tx_queues=49)
br_phy:
br_phy 65534/15: (tap)
dpdk0 1/14: (dpdk: configured_rx_queues=1, configured_tx_queues=49, requested_tx_queues=49)
MPLS/GRE encap without recirc:
root at dl380-668:~# appctl-25 dpif/dump-flows br_phy; appctl-25 dpif/dump-flows br_int
recirc_id(0),in_port(14),eth(src=8c:dc:d4:ab:58:48,dst=8c:dc:d4:ab:5b:f0),eth_type(0x0800),ipv4(dst=10.1.2.8,proto=47,frag=no), packets:329751228, bytes:34953630168, used:0.000s, actions:tnl_pop(8)
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,ttl=64,flags(-df-csum+key)),skb_mark(0),recirc_id(0),in_port(8),eth(dst=52:54:00:a0:91:02),eth_type(0x8847),mpls(label=813/0xfffff,tc=0/0,ttl=4/0x0,bos=1/1), packets:71863832, bytes:4599285248, used:0.000s, actions:set(eth(dst=52:54:00:a0:81:04)),pop_mpls(eth_type=0x800),9
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,ttl=64,flags(-df-csum+key)),skb_mark(0),recirc_id(0),in_port(8),eth(dst=52:54:00:a0:91:03),eth_type(0x8847),mpls(label=812/0xfffff,tc=0/0,ttl=4/0x0,bos=1/1), packets:10595417, bytes:678106688, used:0.001s, actions:set(eth(dst=52:54:00:a0:81:03)),pop_mpls(eth_type=0x800),6
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,ttl=64,flags(-df-csum+key)),skb_mark(0),recirc_id(0),in_port(8),eth(dst=52:54:00:a0:91:04),eth_type(0x8847),mpls(label=815/0xfffff,tc=0/0,ttl=4/0x0,bos=1/1), packets:10465873, bytes:669815872, used:0.000s, actions:set(eth(dst=52:54:00:a0:81:06)),pop_mpls(eth_type=0x800),10
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,ttl=64,flags(-df-csum+key)),skb_mark(0),recirc_id(0),in_port(8),eth(dst=52:54:00:a0:91:05),eth_type(0x8847),mpls(label=814/0xfffff,tc=0/0,ttl=4/0x0,bos=1/1), packets:72711248, bytes:4653519872, used:0.000s, actions:set(eth(dst=52:54:00:a0:81:05)),pop_mpls(eth_type=0x800),7
MPLS/GRE encap with recirc:
root at dl380-668:~# appctl-25 dpif/dump-flows br_phy; appctl-25 dpif/dump-flows br_int
recirc_id(0),in_port(14),eth(src=8c:dc:d4:ab:58:48,dst=8c:dc:d4:ab:5b:f0),eth_type(0x0800),ipv4(dst=10.1.2.8,proto=47,frag=no), packets:584293179, bytes:61935076974, used:0.000s, actions:tnl_pop(8)
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,flags(-df-csum+key)),skb_mark(0),recirc_id(0),in_port(8),eth_type(0x8847),mpls(label=812/0xfffff,tc=0/0,ttl=4/0x0,bos=1/1), packets:35344994, bytes:2262079616, used:0.000s, actions:pop_mpls(eth_type=0x800),recirc(0x8)
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,flags(-df-csum+key)),skb_mark(0),recirc_id(0),in_port(8),eth_type(0x8847),mpls(label=813/0xfffff,tc=0/0,ttl=4/0x0,bos=1/1), packets:164328240, bytes:10517007360, used:0.000s, actions:pop_mpls(eth_type=0x800),recirc(0x12)
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,flags(-df-csum+key)),skb_mark(0),recirc_id(0),in_port(8),eth_type(0x8847),mpls(label=814/0xfffff,tc=0/0,ttl=4/0x0,bos=1/1), packets:166271192, bytes:10641356288, used:0.000s, actions:pop_mpls(eth_type=0x800),recirc(0x14)
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,flags(-df-csum+key)),skb_mark(0),recirc_id(0),in_port(8),eth_type(0x8847),mpls(label=815/0xfffff,tc=0/0,ttl=4/0x0,bos=1/1), packets:32353131, bytes:2070600384, used:0.000s, actions:pop_mpls(eth_type=0x800),recirc(0x16)
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,flags(-df-csum+key)),skb_mark(0),recirc_id(0x8),in_port(8),eth(dst=52:54:00:a0:91:03),eth_type(0x0800),ipv4(frag=no), packets:34268739, bytes:2056124340, used:0.000s, flags:., actions:set(eth(dst=52:54:00:a0:81:03)),6
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,flags(-df-csum+key)),skb_mark(0),recirc_id(0x12),in_port(8),eth(dst=52:54:00:a0:91:02),eth_type(0x0800),ipv4(frag=no), packets:162167251, bytes:9730035060, used:0.000s, flags:., actions:set(eth(dst=52:54:00:a0:81:04)),9
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,flags(-df-csum+key)),skb_mark(0),recirc_id(0x14),in_port(8),eth(dst=52:54:00:a0:91:05),eth_type(0x0800),ipv4(frag=no), packets:164069211, bytes:9844152660, used:0.000s, flags:., actions:set(eth(dst=52:54:00:a0:81:05)),7
tunnel(tun_id=0x0,src=10.1.2.9,dst=10.1.2.8,flags(-df-csum+key)),skb_mark(0),recirc_id(0x16),in_port(8),eth(dst=52:54:00:a0:91:04),eth_type(0x0800),ipv4(frag=no), packets:31327117, bytes:1879627020, used:0.000s, flags:., actions:set(eth(dst=52:54:00:a0:81:06)),10
Detailed measurements:
Packet size # parallel L4 flows branch-2.5 master master
(recirc) (no recirc)
64 8 2377324 1428012 2205425
64 100 2358810 1387175 2209671
64 1000 2310414 1470200 2121747
64 5000 2291150 1443560 2096412
64 10000 2299286 1409919 2177457
64 20000 2298938 1406937 2164322
64 30000 2303101 1399930 2182350
64 50000 2304269 1399208 2187825
64 100000 2303166 1401328 2187800
64 500000 2301091 1401154 2191662
300 8 2279299 1446896 2159220
300 100 2273545 1394192 2150617
300 1000 2219312 1414551 2044742
300 5000 2267291 1387401 2144859
300 10000 2265424 1394049 2159700
300 20000 2268109 1398392 2169303
300 30000 2266996 1399446 2173401
300 50000 2264847 1399667 2170199
300 100000 2266520 1401113 2168330
300 500000 2267000 1401134 2170788
> -----Original Message-----
> From: dev [mailto:dev-bounces at openvswitch.org] On Behalf Of Jan Scheurich
>
> I would like to confirm that Thomas's use case is key also for the BGP/MPLS VPN
> implementation in Open Daylight. In our case OVS is forwarding MPLSoGRE
> encapsulated L3 VPN traffic from physical ports as IP packets to VMs on vhost-
> user ports.
>
> Even without the additional recirculation after pop_mpls, the throughput of the
> DPDK datapath in OVS 2.5 for incoming traffic from the GRE tunnel is less than
> half of the performance for outgoing traffic to the GRE tunnel. The additional,
> unnecessary recirculation will shift that imbalance further. We would be very
> happy to help finding a satisfactory way of implementing a logic to insert
> recirculation only when needed.
>
More information about the dev
mailing list