网卡是 rtl8127, 用 iperf3 测速,在 host 上测速可以达到 9.42 Gbits/sec ,在 lxc 里测速只有 3.25 Gbits/sec ,造成这么大差异的原因是在 lxc 里发送的数据包被拆成了 1.5KB 的小包(也就是 mtu 的大小),而在 host 上发送的数据包是几十 KB 的大包,我想知道如何让 lxc 里发送的数据包也是几十 KB 的大包,有 v 友对这个问题感兴趣愿意一起研究一下吗?

在 host 上运行 iperf3 发包时 sar 的输出如下:

d@develop:~/test$ sar -n DEV 1 | awk '/IFACE/ && !header_done {print; header_done=1} /enp9s0/'
04:57:43 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
04:57:44 PM    enp9s0  19111.00  45161.00   1231.95 1152255.61      0.00      0.00      0.00     94.39
04:57:45 PM    enp9s0  19174.00  45152.00   1235.82 1152169.69      0.00      0.00      0.00     94.39
04:57:46 PM    enp9s0  19072.00  45156.00   1229.25 1152220.90      0.00      0.00      0.00     94.39
04:57:47 PM    enp9s0  18963.00  45156.00   1222.37 1152153.47      0.00      0.00      0.00     94.38

在 lxc 内运行 iperf3 发包时 sar 的输出如下:

d@develop:~/test$ sar -n DEV 1 | awk '/IFACE/ && !header_done {print; header_done=1} /enp9s0/'
04:58:51 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
04:58:52 PM    enp9s0  15288.00 277668.00    985.45 410535.09      0.00      0.00      0.00     33.63
04:58:53 PM    enp9s0  15290.00 277542.00    985.64 410400.17      0.00      0.00      0.00     33.62
04:58:54 PM    enp9s0  15228.00 277660.00    981.49 410523.23      0.00      0.00      0.00     33.63
04:58:55 PM    enp9s0  15265.00 277582.00    983.97 410409.32      0.00      0.00      0.00     33.62

用 txkB/s 除以 txpck/s 就能计算出数据包的大小。

我还试了在 linux 虚拟机(使用 tap 设备,桥接网络)里用 iperf3 测发送的速度, 结果和 lxc 里一样被拆成了小包,但是在虚拟机里用 scp 把本机文件拷贝到其他机器时是大包,而 lxc 里 scp 也是小包,另外更奇怪的是如果是 win11 虚拟机,iperf3 发送的数据包是大包。

我还试了用 macvlan 替代 veth ,结果 lxc 里不管是 iperf3 还是 scp 都不会拆成小包了,但是如果虚拟机用 macvtap ,不管是 iperf3 还是 scp 都全拆成小包了。

这个问题不仅仅出现在 rtl8127 网卡上,rtl8126 和 rtl8125 网卡都一样,只不过在万兆网络下大包和小包两种情况速度的差距更大。

这个问题我已经让 chatgpt plus 和 gemini 3 pro 分析了很多次了,AI 给的方法全都试了都不起作用,AI 只会让我去调整 tso gso gro 以及 mtu 等等参数,都试了都不起作用,感觉现阶段 AI 还是没有能力分析这种非常复杂的问题。

标签: none

添加新评论