ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

25G网卡性能腰斩?PCIe链路降级排查与修复实战

25G网卡性能腰斩?PCIe链路降级排查与修复实战 1. 故障现象与排查思路的建立1.1 一块看起来正常的网卡到底哪里不对机房里一台跑了两年多的计算节点某天开始出现一个很别扭的现象网络没断ping 网关延迟也正常但做 iperf3 打流的时候25G 的 Mellanox ConnectX-6 网卡只能跑到 10Gbps 出头偶尔还会掉到 5Gbps 以下。更奇怪的是ethtool看链路速率显示的是 25000Mb/sibstat里端口状态也是 Active从软件层面看一切正常。这种速率协商正常但实际吞吐腰斩的情况在 PCIe 设备上其实非常典型大概率是PCIe 链路发生了降级。所谓链路降级就是设备本来应该跑在 PCIe Gen4 x16或者 Gen3 x16结果因为物理连接、金手指氧化、插槽灰尘、主板走线等原因实际协商成了 Gen4 x8、Gen3 x8 甚至更低。带宽直接砍半网卡本身的 25G 能力再强也发挥不出来。排查这类问题的核心思路是先确认 PCIe 链路状态再定位物理层问题最后验证修复效果。不要一上来就怀疑驱动、固件、内核参数那些都是次要的。PCIe 是网卡的地基地基歪了上面盖什么都白搭。1.2 为什么先看 lspci 而不是先看 ethtool很多同行的第一反应是ethtool ethX看 Speed、Duplex、Link detected。但ethtool反映的是网口侧的链路状态也就是网卡 PHY 和交换机之间的协商结果跟 PCIe 侧完全是两码事。网口跑 25G 不代表 PCIe 跑满PCIe 降级了网口照样能显示 25G。真正要看 PCIe 链路得用lspci加上-vv参数重点看两个字段LnkCapLink Capabilities设备支持的最大链路能力比如Speed 16GT/s, Width x16LnkStaLink Status当前实际协商到的链路状态比如Speed 8GT/s, Width x8如果 LnkSta 明显低于 LnkCap那就是降级了。这个判断方法适用于所有 PCIe 设备不只是网卡显卡、NVMe SSD、RAID 卡都一样。提示lspci -vv需要 root 权限才能看到完整的 LnkCap/LnkSta 信息普通用户执行会显示不全。1.3 本次故障的初步定位先找到网卡的 PCI 地址lspci | grep -i mellanox输出类似3b:00.0 Ethernet controller: Mellanox Technologies MT28908 Family [ConnectX-6]然后针对这个地址看详细链路信息lspci -vv -s 3b:00.0 | grep -A2 -i lnk实际输出LnkCap: Port #0, Speed 16GT/s, Width x16, ASPM not supported LnkSta: Speed 8GT/s (downgraded), Width x8 (downgraded)问题一目了然LnkCap 是 Gen4 x16LnkSta 只有 Gen3 x8。Gen4 x16 的理论带宽是 32GB/sGen3 x8 只有 8GB/s直接掉到四分之一。25G 网卡满速需要大约 3.125GB/s 的单向带宽Gen3 x8 双向 16GB/s 理论上够用但实际因为编码开销、TLP 包头、流控等因素有效带宽会打折扣再加上降级往往伴随误码率上升吞吐自然上不去。2. PCIe 链路降级的原理与常见诱因2.1 PCIe 链路协商到底是怎么发生的要理解降级得先知道 PCIe 链路是怎么谈出来的。上电之后PCIe 设备会经历一个叫LTSSMLink Training and Status State Machine的状态机过程大致分几个阶段Detect、Polling、Configuration、Recovery、L0。其中 Configuration 阶段会进行链路宽度和速率的协商。协商的原则是就低不就高双方各自报出自己能支持的最高速率和最大宽度然后取交集再逐级尝试。如果 Gen4 x16 训练失败会退到 Gen3 x16再失败退到 Gen3 x8以此类推。所以降级本质上是物理层信号完整性不达标导致高速率或大宽度训练失败硬件自动降级以保证链路可用。这也解释了为什么降级后系统不会报错——PCIe 的设计哲学就是能用就行降级是它自我保护的机制不是故障。但对性能敏感的场景来说这就是实打实的故障。2.2 物理层诱因从金手指到插槽导致降级的物理原因按出现频率从高到低排诱因典型表现排查难度金手指氧化/污染单条 lane 训练失败宽度降级低插槽灰尘/异物宽度降级或速率降级低网卡未完全插入宽度大幅降级低主板走线/PCB 质量问题高速率训练失败高供电不足随机降级伴随其他异常中散热不良导致芯片降频高负载下才降级中BIOS 中 PCIe 速率被限制稳定降级到固定档位低本次故障的机器在机房跑了两年多机房环境虽然恒温恒湿但灰尘积累是免不了的。而且这块 ConnectX-6 是半高卡插在一个转接 riser 上riser 的金手指和插槽接触面更容易出问题。2.3 软件层诱因BIOS 与内核参数物理层之外还有几个软件层面的坑BIOS 里 PCIe 速率被手动限制有些主板默认把某些插槽设成 Gen3或者为了兼容性把速率锁死。这种情况 LnkCap 本身就会显示较低速率而不是 LnkSta 降级。ASPM 电源管理ASPM 开启后链路会在空闲时进入低功耗状态某些情况下会导致训练不稳定。不过 ConnectX-6 通常不支持 ASPM本次不是这个原因。内核 PCIe 参数pcie_aspmoff、pcinoaer这类参数会影响链路行为但一般不会导致降级。判断是物理还是软件问题有个简单方法看 LnkCap 是否正常。如果 LnkCap 显示 Gen4 x16说明设备能力没问题降级是物理层训练失败如果 LnkCap 本身就低那可能是 BIOS 限制或插槽本身能力不足。3. 完整排查流程与实操记录3.1 第一步确认降级事实并记录基线排查任何问题第一步都是记录当前状态作为基线否则修完了没法对比。我习惯把关键信息一次性抓全# 网卡 PCI 地址 lspci | grep -i mellanox # 完整链路信息 lspci -vv -s 3b:00.0 /tmp/pcie_before.txt # 网口速率 ethtool eth0 | grep -E Speed|Duplex|Link # 当前吞吐基线 iperf3 -c server_ip -t 30 -P 4基线记录LnkCap: Gen4 x16LnkSta: Gen3 x8降级ethtool Speed: 25000Mb/siperf3 实测约 11.2 Gbps这个基线很关键后面修复完要拿同样的命令再跑一遍对比。3.2 第二步排除软件层干扰在动手拆机之前先把软件层的可能性排掉避免白拆一趟。检查 BIOS 设置重启进 BIOS找到 PCIe 相关选项确认插槽速率没有被限制。不同主板叫法不一样常见的有PCIe Speed、PCIe Link Speed、PCIe Max Link Speed确保是 Auto 或 Gen4。检查内核日志dmesg 里搜 PCIe 相关报错dmesg | grep -iE pcie|aer|correctable|link如果看到大量Correctable Error或者Link Down记录说明物理层确实有问题。本次 dmesg 里有一些 AER correctable error进一步佐证了物理层信号质量不佳。检查是否被限速有些服务器 BIOS 有节能模式会把空闲插槽降速确认没开这类选项。软件层排查完基本可以确定是物理问题进入下一步。3.3 第三步物理检查与清洁这一步是本次故障的核心。操作前务必关机断电拔掉电源线按几次电源键释放残余电荷。拆下网卡后重点检查三个地方网卡金手指用橡皮擦普通文具橡皮就行别用砂纸顺着金手指方向轻轻擦拭擦到发亮为止。注意不要用手直接摸金手指手上的油脂会加速氧化。PCIe 插槽用气吹或者压缩空气罐吹掉灰尘插槽深处可以用软毛刷轻轻扫。如果插槽里有明显的异物或者针脚变形那就不是清洁能解决的了。riser 卡本次故障的机器用了 riserriser 的金手指和插槽同样要清洁。riser 是降级的高发区因为多了一次连接信号衰减更严重。清洁完重新插回确保插到底卡扣扣紧。半高卡有时候看着插进去了其实差一点点没到位这种情况会导致宽度降级。3.4 第四步验证修复效果开机后重新抓链路信息lspci -vv -s 3b:00.0 | grep -A2 -i lnk修复后输出LnkCap: Port #0, Speed 16GT/s, Width x16, ASPM not supported LnkSta: Speed 16GT/s, Width x16LnkSta 恢复到了 Gen4 x16降级消除。再跑 iperf3iperf3 -c server_ip -t 30 -P 4实测吞吐从 11.2 Gbps 提升到 23.8 Gbps接近 25G 网卡的线速。问题解决。3.5 修复前后对比指标修复前修复后LnkSta Speed8GT/s (Gen3)16GT/s (Gen4)LnkSta Widthx8x16ethtool Speed25000Mb/s25000Mb/siperf3 吞吐11.2 Gbps23.8 Gbpsdmesg AER 错误有无注意 ethtool 的 Speed 前后都是 25000Mb/s这再次说明光看 ethtool 判断不出 PCIe 降级必须看 lspci。4. 常见问题与避坑经验4.1 为什么清洁后还是降级如果清洁完 LnkSta 还是低按这个顺序排查换个插槽试试有些主板的不同插槽走线质量不一样CPU 直连的插槽通常比芯片组转出来的好。换根 riserriser 质量参差不齐劣质 riser 跑 Gen4 很容易降级。BIOS 里手动锁 Gen3如果 Gen4 实在训练不稳定可以手动锁 Gen3 x16虽然速率降一档但宽度保住 x16总带宽比 Gen3 x8 高得多。这是个实用的妥协方案。检查供电ConnectX-6 功耗不低确认插槽供电充足必要时接辅助供电。4.2 降级不一定是硬件坏很多人一看到降级就以为网卡坏了其实大部分情况清洁一下就好。PCIe 金手指氧化是非常普遍的现象尤其是机房环境。我遇到过好几次都是橡皮擦一擦就恢复。真正硬件损坏比如 lane 物理断裂反而少见那种情况通常表现为宽度直接掉到 x1 或者设备直接不识别。4.3 定期巡检比事后排查更重要这次故障给我最大的教训是PCIe 链路状态应该纳入日常巡检。写个简单的脚本定期抓所有关键 PCIe 设备的 LnkSta跟 LnkCap 对比一旦发现降级就告警。这样能在性能明显下降之前就发现问题避免业务受影响。#!/bin/bash # 检查所有 PCIe 设备是否有降级 for dev in $(lspci | awk {print $1}); do info$(lspci -vv -s $dev 2/dev/null | grep -E LnkCap|LnkSta) cap_speed$(echo $info | grep LnkCap | grep -oP Speed \K[0-9.]) sta_speed$(echo $info | grep LnkSta | grep -oP Speed \K[0-9.]) cap_width$(echo $info | grep LnkCap | grep -oP Width x\K[0-9]) sta_width$(echo $info | grep LnkSta | grep -oP Width x\K[0-9]) if [ -n $cap_speed ] [ $cap_speed ! $sta_speed ]; then echo 降级: $dev 速率 $sta_speed (能力 $cap_speed) fi if [ -n $cap_width ] [ $cap_width ! $sta_width ]; then echo 降级: $dev 宽度 x$sta_width (能力 x$cap_width) fi done这个脚本可以直接丢到 cron 里每天跑一次输出重定向到日志有降级就发告警。4.4 几个容易踩的坑别用砂纸或刀片刮金手指会刮掉镀金层反而加速氧化。橡皮擦足够。别用手摸金手指手上的汗液和油脂是氧化的元凶。清洁后别急着装回去先目视检查插槽有没有残留的橡皮屑橡皮屑留在插槽里会导致接触不良。记录基线再动手没有基线修完了你都不知道有没有改善。一次只改一个变量清洁、换插槽、换 riser 分开做否则出了问题不知道是哪个环节导致的。4.5 关于 ConnectX-6 的一些补充ConnectX-6 是 Mellanox 的 25G/100G 网卡PCIe 接口是 Gen4 x16。它对 PCIe 链路质量比较敏感因为 100G 模式下需要 Gen4 x16 才能跑满。25G 模式下 Gen3 x8 理论够用但实际因为降级往往伴随误码性能会打折扣。如果你用的是 100G 模式PCIe 降级的后果会更严重可能直接掉到 40G 以下。另外ConnectX-6 支持mlxconfig工具查看和配置固件参数但 PCIe 链路速率和宽度是硬件协商的结果固件层面改不了。别在固件上浪费时间直接查物理层。5. 从这次故障延伸出的思考5.1 PCIe 降级是个沉默的杀手这次故障最坑的地方在于它不报错、不断网、不影响基本通信只是性能悄悄下降。如果不是做性能测试可能几个月都发现不了。对于跑数据库、分布式存储、AI 训练这类对带宽敏感的业务PCIe 降级造成的性能损失是实打实的而且很难归因。所以我的建议是把 PCIe 链路检查纳入标准巡检流程跟 CPU 温度、内存 ECC 错误、磁盘 SMART 一样对待。成本很低收益很大。5.2 物理层问题永远优先于软件层排查硬件性能问题永远遵循从物理到逻辑的顺序。先看线缆、插槽、金手指再看驱动、固件、内核参数。我见过太多人一上来就折腾驱动版本、内核参数结果问题出在一根松了的线或者氧化的金手指上。物理层是地基地基不稳上面怎么调都是徒劳。5.3 关于 lspci 的更多用法lspci是排查 PCIe 问题的瑞士军刀除了-vv还有几个实用参数lspci -t树形显示 PCIe 拓扑能看出设备挂在哪个桥下面lspci -vvv更详细包含更多能力寄存器信息lspci -xxx以十六进制 dump 配置空间适合深度排查lspci -k显示设备使用的内核驱动排查降级问题lspci -vv配合grep Lnk基本够用。如果要看拓扑关系加-t。5.4 一个容易被忽略的细节链路宽度和速率要一起看很多人只看速率忽略了宽度。实际上宽度降级比速率降级更常见也更隐蔽。Gen4 x8 和 Gen3 x16 的理论带宽差不多但实际表现可能不一样。判断降级要速率和宽度一起看任何一个低于 LnkCap 都是降级。另外LnkCap 里的速率是设备支持的最高速率但插槽本身可能不支持那么高。比如把 Gen4 网卡插到 Gen3 插槽上LnkCap 会显示 Gen4设备能力但 LnkSta 是 Gen3实际协商这种情况不算故障是插槽能力限制。判断时要结合主板规格一起看。5.5 最后分享一个快速判断技巧如果你怀疑某台机器的 PCIe 设备降级又不想一条条看 lspci可以用这个一行命令快速扫一遍lspci -vv 2/dev/null | grep -B1 LnkSta | grep -A1 LnkCap | grep -E LnkCap|LnkSta输出里如果 LnkSta 的 Speed 或 Width 低于 LnkCap就是降级。这个方法适合快速巡检定位到具体设备后再用-s参数细看。这次从发现性能异常到定位 PCIe 降级再到清洁金手指修复整个过程大概花了两个小时其中拆机清洁只用了二十分钟大部分时间花在确认问题和验证效果上。经验就是遇到网卡性能不达标先看 lspci 的 LnkSta别急着怀疑驱动和固件。这个习惯帮我省下了无数次无谓的折腾。
返回列表