📌 转载说明:本文首发于微信公众号《闫工的算力工具箱》 原文链接:https://mp.weixin.qq.com/s/jYKUvo2zwJCZ8OBNpBP-zg
【闫工的工具箱 · 第 12 弹|实战】 #
我是闫工,数据中心搬砖的 CCIE。
先直接说损失账:这台 8 卡 GPU服务器交付当天就趴窝,训练集群少算力一小时,客户那边就是一笔真金白银。更让人挠头的是,显卡全在、驱动正常,卡死的却是训练任务。
先解释下标题里的黑话:NVLink 是 GPU 之间的高速通道,Fabric Manager(FM)是管这条通道的服务。这台机器的问题,就是 NVLink 悄悄坏了一半,而 FM 这个"交警"直接罢工了。一开始按驱动问题处理,重装驱动、换 CUDA 版本,折腾了半天。后来才搞明白,FM 只需改一行配置,就能让这台机器"带伤上岗"。
— — —
1. 诡异现场:训练卡死,FM 反复起不来 #
新上架的 8 卡 A800-SXM4-80GB,跑分布式训练时 NCCL 疯狂报错。先看服务状态:
systemctl status nvidia-fabricmanager
● nvidia-fabricmanager.service - NVIDIA fabric manager service
Active: activating (start) since Fri 2026-07-24 16:24:59 CST; 1s agoactivating → failed → activating → failed,无限循环。再看日志:
journalctl -u nvidia-fabricmanager -n 50
nv-fabricmanager[31506]: NVLink initialization failed for NodeId:0 nvswitch0 NVLink:24
nv-fabricmanager[31506]: NVLink initialization failed for NodeId:0 GPU PCI bus id:00000000:55:00.0 enumIndex:5 NVLinkIndex 3
nv-fabricmanager[31506]: global fabric manager initialization failed
More than one NVSwitches have trunk NVLink failed, set to abort Fabric manager
上面几行是细节,最后一句 More than one NVSwitches have trunk NVLink failed 才是破案核心——它直接告诉我们,故障发生在 NVSwitch 的 Trunk 链路上。不止一个 NVSwitch 的 trunk 链路坏了,FM 的安全机制直接中止启动,宁可停机也不带伤运行。这个设计平时是保护,排查时就成了迷惑源:明明 GPU 都在,服务却起不来,很容易让人误判成驱动问题。
2. 破案:nvidia-smi 一行看出 NVLink 伤情 #
FM 起不来,但 GPU 本身是活的。用 nvidia-smi nvlink –status 看每条 NVLink 链路:

结果是这样的:
| GPU | 故障链路 | 正常链路 | 故障率 |
|---|---|---|---|
| GPU 0 | 1 条 | 7 条 | 12.5% |
| GPU 1 | 2 条 | 6 条 | 25% |
| GPU 2 | 1 条 | 7 条 | 12.5% |
| GPU 3 | 5 条 | 3 条 | 62.5% |
| GPU 4-7 | 0 条 | 8 条 | 0%(正常) |
GPU 3 最惨,8 条 NVLink 废了 5 条,基本等于半残。还有个细节:GPU 0-3 在一台 NVSwitch 域里,GPU 4-7 在另一台,后者完全正常。
nvidia-smi topo -m 确认拓扑:

GPU 0↔GPU 3 只有 3 条 NVLink(NV3,正常应 8 条),GPU 4↔GPU 7 是完整的 NV8。问题集中在 GPU 0-3 这个 NVSwitch 域。
dmesg 也给出佐证:
dmesg | grep "NVRM.*fabric address"
NVRM: knvlinkCheckNvswitchP2pConfig_IMPL: GPU 0 doesn't have a fabric address
NVRM: knvlinkCheckNvswitchP2pConfig_IMPL: GPU 3 doesn't have a fabric addressGPU 0 和 GPU 3 拿不到有效的 fabric 地址,NVSwitch 的 trunk 链路没建立起来,GPU 连不上 NVSwitch。
3. Access Link 还是 Trunk Link?故障面完全不同 #
NVLink 链路分两种,故障影响差得远:
- Access Link(GPU → NVSwitch):只影响单个 GPU 的通信;
- Trunk Link(NVSwitch ↔ NVSwitch):影响整个 NVLink 域。
咱们这次是 Trunk Link 故障,NVSwitch 之间断了,整个 GPU 0-3 域通信瘫痪。这也是 FM 直接 abort 的原因:它检测到"多个 NVSwitch trunk 失败",认为整个 fabric 不可信,干脆停机保平安。
4. 为什么换块 GPU 没用?根子在 NVSwitch #
有人会问:换块 GPU 试试?没用。根子不在 GPU 卡上,而在 NVSwitch 芯片或 GPU 与 NVSwitch 之间的物理连接(背板/线缆)。可能的硬件原因:
- GPU 3 的 NVLink 引脚 / 背板接触不良;
- NVSwitch 芯片部分 trunk 链路损坏;
- 电源波动导致 NVLink 链路不稳定;
- NVSwitch 过热自动降级。
5. 解决方案:修改 FM 配置,容忍 NVLink 故障 #
硬件换不了,业务不能停。那就改 Fabric Manager 配置,让它容忍部分 NVLink 故障,坏哪块禁哪块,剩下的 GPU 继续干活。
1. 停服务
systemctl stop nvidia-fabricmanager
2. 追加配置(NVLink 故障容忍)
cat >> /usr/share/nvidia/nvswitch/fabricmanager.cfg << 'EOF'
# NVLink故障容忍配置
TRUNK_LINK_FAILURE_MODE=1 # 禁用故障NVSwitch,不影响整体
ACCESS_LINK_FAILURE_MODE=0 # 移除故障GPU的P2P能力
NVSWITCH_FAILURE_MODE=1 # 禁用故障NVSwitch
FM_STAY_RESIDENT_ON_FAILURES=1 # 即使有故障也保持运行
EOF
3. 启动服务
systemctl start nvidia-fabricmanager⚠️ 配置文件路径因发行版/厂商而异:不同发行版或服务器厂商(如 Dell、HPE)的配置文件路径可能不同,我这里是
/usr/share/nvidia/nvswitch/fabricmanager.cfg,你的机器可能是/etc/nvidia/fabricmanager.cfg。如果上述路径不存在,用这条命令确认实际位置,别照抄: find / -name “*fabricmanager*.cfg” 2>/dev/null


FM 启动成功,故障 NVSwitch 被禁用,其余 GPU 继续工作,训练恢复。虽然 GPU 0-3 之间通信降级,但整体业务能跑,这已经是最好的结果了。
6. 备选方案(按风险从低到高) #
| 方案 | 操作 | 效果 | 风险 |
|---|---|---|---|
| ① 改 FM 配置(推荐) | 追加故障容忍配置 | 禁坏 NVSwitch,其余继续 | 低 |
| ② GPU 软重置 | nvidia-smi –gpu-reset + 重载驱动 | 可能恢复部分 NVLink | 中 |
| ③ 完全断电重启 | 关机、拔电源 30 秒、上电 | 最彻底,可能解决锁死 | 中高 |
| ④ 禁用全部 NVLink | 内核参数 NVreg_NvLinkDisable=1 | GPU 走 PCIe 通信,性能暴跌约 95% | 高 |
⚠️ 方案③的风险:A800 SXM 是整机系统(DGX/HGX),完全断电会导致所有 GPU 同时掉电,可能影响 NVLink fabric 的初始化顺序,甚至让本来正常的链路也暂时起不来。部分节点重启后需要重新配置 FM。建议作为最后手段,先试 ①②。
方案④的性能账:NVLink 域内带宽约 600 GB/s,禁用后 GPU 之间走 PCIe 4.0 x16(约 32 GB/s),暴跌约 95%,等于把 8 卡机变成 8 台独立机器。
7. 给交付团队的建议 #
几条血的教训,写进你的检查清单:
- 验收必查 NVLink:nvidia-smi nvlink –status + nvidia-smi topo -m,别只看 nvidia-smi 8 卡在不在;
- FM 状态要看:systemctl status nvidia-fabricmanager 必须 active,activating 就是有坑;
- 区分 Access/Trunk:trunk 故障影响整域,故障面比单卡大得多;
- NVLink 故障不致命但影响性能:把坏域 GPU 放同一节点、不同通信组,能有效规避影响。