网卡是 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 还是没有能力分析这种非常复杂的问题。
1
geeglo 15 小时 3 分钟前
物理机能发大包的前提是网卡支持硬件 offload. 系统检测到相关参数启用,内核就不会切片。
我猜测是 lxc 没把这部分驱动带进去。 |
2
wniming OP @geeglo 大佬你说的太笼统了,我想知道做什么设置能直接解决这个问题,刚才我又测试了 win11 虚拟机用 macvtap 桥接网络,结果 iperf3 是小包,但 librespeed 是大包,而 linux 虚拟机用 librespeed 测是小包。
|
4
geeglo 13 小时 11 分钟前
ethtool -k eth0 截图看看呢
|
5
geekvcn 13 小时 3 分钟前 via Android
给物理网卡,Linux 网桥,veth 对的 MTU 都修改到 9000 试试
|
6
geekvcn 13 小时 2 分钟前 via Android
对网络性能有要求,还是建议修改 LXC 配置文件直接透传物理网卡给 LXC 容器
|
7
om2mo 9 小时 16 分钟前 via Android
lxc 有 host 模式 用标准的“宿主”说法
我在宿主和容器里测试没区别 [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 10.3 GBytes 8.81 Gbits/sec 0 sender [ 5] 0.00-10.00 sec 10.3 GBytes 8.81 Gbits/sec receiver |