MCX516A-CCAT 通过 100G DAC 组网状拓扑:lshw 显示 40Gbit/s,单条 iperf3 流最高只能到 21 Gbit/s
我们有一个三节点集群,节点之间直接用 100G DAC 互连,中间不经过交换机,接口做成 broadcast bond,让复制流量有自己独立的网络平面。在跑真实负载之前我想先测个基线,结果几个工具给出的数字互相对不上。
- 3 块 Mellanox ConnectX-5 EN,MCX516A-CCAT,双口 QSFP28
- 每两个节点之间都用一根 100G DAC 连接
- AMD EPYC 主机,三台都跑 Proxmox
ethtool 显示得很正常:
# ethtool ens1
Settings for ens1:
Supported link modes: 100000baseCR4/Full
Advertised link modes: 100000baseCR4/Full
Speed: 100000Mb/s
Duplex: Full
Link detected: yes
lshw却不是:
# lshw -class network
*-network
description: Ethernet interface
vendor: Mellanox Technologies
capacity: 40Gbit/s
两个节点之间跑 iperf3,速度大约在 21 Gbit/s 左右,跟前面两个数字都对不上。
已经做过:
- 把线缆换到两块网卡的第二个端口,没有变化
- 换了一根同型号的 DAC,没有变化
- 链路全程保持 up,计数器上没有累积错误
所以这两个工具到底哪个在骗我,我该去查线缆、网卡,还是驱动?
Comments 5
你贴出来的信息没有一处指向 DAC 有问题。这里其实是两件互不相关的事情。
第一,数字对不上的问题。
lshw -class network打印的是它自己算出来的一个能力数值,在这些网卡上,即使链路实际协商到了 100G,它也照样会心安理得地写capacity: 40Gbit/s。真正协商到的速率要看ethtool,你这边显示的是Speed: 100000Mb/s,并且协商出的是100000baseCR4/Full。这部分完全没问题,不用管它。第二,吞吐量的问题。先在动别的东西之前查一下插槽:
如果
LnkSta训练在 2.5GT/s,而LnkCap写的是 8GT/s,那你的带宽本来就被死死限制在远低于线速的水平,不管怎么换线缆都没用。重新插拔一下网卡,确保它插在一个真正按满宽度接线的插槽里。然后不要再用单条流去测速:
在这个级别的主机上,单核大概就能跑出 21 Gbit/s 左右,所以单看这个数字说明不了太多问题。测的时候关注一下 CPU 占用,也看看空闲状态在做什么:在两次突发之间,核心掉进深度 C-state 会在这个速率下实实在在地吃掉带宽。
在下单换任何东西之前,把那块网卡
lspci -vv里的LnkSta那一行,还有你用的完整 iperf3 命令行都贴出来。单条流跑 100G,测的其实是单个 CPU 核心,不是链路本身,这个坑很多人一栽就是好几天。另外测试的时候确认一下第二个端口是不是真的在承载 mesh 的另一条链路,而不是闲着——一个插槽同时喂两个正在工作的 100G 端口,和只喂一个,预算完全不是一回事。我建议现在先别管lshw,这个问题不该用它来判断。关于 C-state 那部分要更正一下:如果主机是 EPYC,那些帖子里到处贴的
intel_idle相关设置对你没有任何作用,那个驱动在 AMD 上根本不在路径里。对我有效的开关是内核命令行里的processor.max_cstate=2。思路一样,平台不同。前面那条回复的其他部分是对的,尤其是不要拿lshw当作协商速率的依据这一点。一个不太一样的故障,同一类硬件,在插槽问题解决之后也值得排查一下:ConnectX-5 QSFP28 端口直连组网,在三层上很容易配错。我这边是三个节点,MCX516A-CCA_Ax,固件 16.35.4030,配 DOCA 2.8.0 驱动,用 MCP1600-C003E30L 3 米铜缆连接。每条链路都报告 100 Gbps active,但一个 ping 都通不过。所有六个 mesh 接口的地址都来自同一个 10.5.5.x 网段,中间又没有交换机,内核根本没法判断某个目的地到底该走哪个物理端口。改成每对节点一个独立网段——10.5.5.x、10.5.6.x、10.5.7.x——之后就正常了。建议在怪罪铜缆之前,先在三台机器上都跑一下
ip a和ip route。两点都说中了。
lspci -vv显示网卡训练在 2.5GT/s,而LnkCap是 8GT/s,这是头号嫌疑对象。我把三台机器上的网卡都换了个插槽,现在LnkSta稳定在 8GT/s,用iperf3 -P 8测同一对节点,数字立刻就超过了单条流的结果。我也放弃了 broadcast bond,改用 Open vSwitch 配 RSTP 重建了这个 mesh。用 iperf 把流量分散到三个 CPU 线程和两个端口上,现在能测到大约 95 Gbit/s,对这个集群的用途来说已经足够接近线速了。
lshw依然坚持说 40Gbit/s,我已经不管它了。