William reported that there is iperf TCP issue between two afxdp ports: [ 3] local 10.1.1.2 port 40384 connected with 10.1.1.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0- 1.0 sec 17.0 MBytes 143 Mbits/sec [ 3] 1.0- 2.0 sec 9.62 MBytes 80.7 Mbits/sec [ 3] 2.0- 3.0 sec 6.75 MBytes 56.6 Mbits/sec [ 3] 3.0- 4.0 sec 11.0 MBytes 92.3 Mbits/sec [ 3] 5.0- 6.0 sec 0.00 Bytes 0.00 bits/sec [ 3] 6.0- 7.0 sec 0.00 Bytes 0.00 bits/sec [ 3] 7.0- 8.0 sec 0.00 Bytes 0.00 bits/sec [ 3] 8.0- 9.0 sec 0.00 Bytes 0.00 bits/sec [ 3] 9.0-10.0 sec 0.00 Bytes 0.00 bits/sec [ 3] 10.0-11.0 sec 0.00 Bytes 0.00 bits/sec
The reason is, currently, netdev-afxdp's batch size is 32 while kernel's xdp batch size is only 16. This can result in exhausting of sock wmem if netdev-afxdp keeps sending large number of packets. Later on, when ARP expires at one side of TCP connection, ARP packets can be delayed or even dropped because sock wmen is already full. This patch fixes this issue by reducing netdev-afxdp's batch size so as to match kernel's xdp batch size. Now iperf TCP works correctly. [ 3] local 10.1.1.2 port 57770 connected with 10.1.1.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0- 1.0 sec 262 MBytes 2.20 Gbits/sec [ 3] 1.0- 2.0 sec 299 MBytes 2.51 Gbits/sec [ 3] 2.0- 3.0 sec 271 MBytes 2.27 Gbits/sec [ 3] 3.0- 4.0 sec 247 MBytes 2.07 Gbits/sec [ 3] 4.0- 5.0 sec 290 MBytes 2.43 Gbits/sec [ 3] 5.0- 6.0 sec 292 MBytes 2.45 Gbits/sec [ 3] 6.0- 7.0 sec 223 MBytes 1.87 Gbits/sec [ 3] 7.0- 8.0 sec 243 MBytes 2.04 Gbits/sec [ 3] 8.0- 9.0 sec 234 MBytes 1.97 Gbits/sec [ 3] 9.0-10.0 sec 238 MBytes 2.00 Gbits/sec Reported-by: William Tu <[email protected]> Reported-at: https://mail.openvswitch.org/pipermail/ovs-dev/2019-November/365076.html Signed-off-by: Yifeng Sun <[email protected]> --- lib/netdev-afxdp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/netdev-afxdp.c b/lib/netdev-afxdp.c index 58365ed483e3..38bbbeb055cc 100644 --- a/lib/netdev-afxdp.c +++ b/lib/netdev-afxdp.c @@ -82,7 +82,7 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); * enough for most corner cases. */ #define NUM_FRAMES (4 * (PROD_NUM_DESCS + CONS_NUM_DESCS)) -#define BATCH_SIZE NETDEV_MAX_BURST +#define BATCH_SIZE 16 BUILD_ASSERT_DECL(IS_POW2(NUM_FRAMES)); BUILD_ASSERT_DECL(PROD_NUM_DESCS == CONS_NUM_DESCS); -- 2.7.4 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
