V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wniming
V2EX  ›  Linux

LXC veth 桥接网络模式下如何避免发送的数据包被拆成小包?

  •  
  •   wniming · 15 小时 14 分钟前 · 560 次点击

    网卡是 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 还是没有能力分析这种非常复杂的问题。

    7 条回复    2026-04-18 23:49:44 +08:00
    geeglo
        1
    geeglo  
       15 小时 3 分钟前
    物理机能发大包的前提是网卡支持硬件 offload. 系统检测到相关参数启用,内核就不会切片。
    我猜测是 lxc 没把这部分驱动带进去。
    wniming
        2
    wniming  
    OP
       14 小时 52 分钟前
    @geeglo 大佬你说的太笼统了,我想知道做什么设置能直接解决这个问题,刚才我又测试了 win11 虚拟机用 macvtap 桥接网络,结果 iperf3 是小包,但 librespeed 是大包,而 linux 虚拟机用 librespeed 测是小包。
    wniming
        3
    wniming  
    OP
       14 小时 51 分钟前
    @wniming #2 linux 虚拟机如果用 tap 设备桥接网络的话, 用 librespeed 测是大包,macvtap 的情况下是小包。
    geeglo
        4
    geeglo  
       13 小时 11 分钟前
    ethtool -k eth0 截图看看呢
    geekvcn
        5
    geekvcn  
       13 小时 3 分钟前 via Android
    给物理网卡,Linux 网桥,veth 对的 MTU 都修改到 9000 试试
    geekvcn
        6
    geekvcn  
       13 小时 2 分钟前 via Android
    对网络性能有要求,还是建议修改 LXC 配置文件直接透传物理网卡给 LXC 容器
    om2mo
        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
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2429 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:06 · PVG 09:06 · LAX 18:06 · JFK 21:06
    ♥ Do have faith in what you're doing.