CodingBox Q&A Ask question

MCX516A-CCAT 通过 100G DAC 组网状拓扑:lshw 显示 40Gbit/s,单条 iperf3 流最高只能到 21 Gbit/s

Asked Active Viewed 49 AI translation from English
2

我们有一个三节点集群,节点之间直接用 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

Accepted answer

你贴出来的信息没有一处指向 DAC 有问题。这里其实是两件互不相关的事情。

第一,数字对不上的问题。lshw -class network 打印的是它自己算出来的一个能力数值,在这些网卡上,即使链路实际协商到了 100G,它也照样会心安理得地写 capacity: 40Gbit/s。真正协商到的速率要看 ethtool,你这边显示的是 Speed: 100000Mb/s,并且协商出的是 100000baseCR4/Full。这部分完全没问题,不用管它。

第二,吞吐量的问题。先在动别的东西之前查一下插槽:

# lspci -vv
        LnkCap: ... Speed 8GT/s ...
        LnkSta: ... Speed 2.5GT/s ... (downgraded)

如果 LnkSta 训练在 2.5GT/s,而 LnkCap 写的是 8GT/s,那你的带宽本来就被死死限制在远低于线速的水平,不管怎么换线缆都没用。重新插拔一下网卡,确保它插在一个真正按满宽度接线的插槽里。

然后不要再用单条流去测速:

# iperf3 -P 8 -c <peer>

在这个级别的主机上,单核大概就能跑出 21 Gbit/s 左右,所以单看这个数字说明不了太多问题。测的时候关注一下 CPU 占用,也看看空闲状态在做什么:在两次突发之间,核心掉进深度 C-state 会在这个速率下实实在在地吃掉带宽。

3 Taiwanlinkeng56TW Show original (English) AI translation

在下单换任何东西之前,把那块网卡 lspci -vv 里的 LnkSta 那一行,还有你用的完整 iperf3 命令行都贴出来。单条流跑 100G,测的其实是单个 CPU 核心,不是链路本身,这个坑很多人一栽就是好几天。另外测试的时候确认一下第二个端口是不是真的在承载 mesh 的另一条链路,而不是闲着——一个插槽同时喂两个正在工作的 100G 端口,和只喂一个,预算完全不是一回事。我建议现在先别管 lshw,这个问题不该用它来判断。

3 United Arab Emirateslambdahawk88AE Show original (English) AI translation

关于 C-state 那部分要更正一下:如果主机是 EPYC,那些帖子里到处贴的 intel_idle 相关设置对你没有任何作用,那个驱动在 AMD 上根本不在路径里。对我有效的开关是内核命令行里的 processor.max_cstate=2。思路一样,平台不同。前面那条回复的其他部分是对的,尤其是不要拿 lshw 当作协商速率的依据这一点。

2 SpainoptictechES Show original (English) AI translation

一个不太一样的故障,同一类硬件,在插槽问题解决之后也值得排查一下: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。

1 Ukrainerxnode71UA Show original (English) AI translation

两点都说中了。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,我已经不管它了。

1 United Kingdomcoaxpilot98GB Show original (English) AI translation
Log in to comment. Log in