PCIe AER 错误监控与链路健康检查

基于 RTX 5090 实测——本环境所有 AER 计数器为 0,PCIe Replay = 0,链路信号质量完美。本文教读者如何通过 sysfs 和 nvidia-smi 监控 PCIe 链路健康状态。


1. 什么是 PCIe AER

AER (Advanced Error Reporting) 是 PCIe 规范定义的标准化错误报告机制。每条 PCIe 链路有两组计数器:

类别 说明 影响
Correctable 硬件自动纠正的错误(如单 bit 翻转) 不影响数据正确性,但降低有效带宽
Uncorrectable 无法纠正的错误 分 Fatal(致命)和 Non-Fatal(可恢复)

2. sysfs 读取 AER 计数器

2.1 文件路径

GPU_BDF="0000:98:00.0"  # BDF = Bus:Device.Function,PCIe 设备的唯一地址标识

# 可纠正错误
cat /sys/bus/pci/devices/$GPU_BDF/aer_dev_correctable

# 致命错误
cat /sys/bus/pci/devices/$GPU_BDF/aer_dev_fatal

# 非致命错误
cat /sys/bus/pci/devices/$GPU_BDF/aer_dev_nonfatal

2.2 本环境实测

# 可纠正错误 — 全部为 0
cat /sys/bus/pci/devices/0000:98:00.0/aer_dev_correctable
RxErr 0            # 接收错误
BadTLP 0           # 损坏的 TLP (Transaction Layer Packet)
BadDLLP 0          # 损坏的 DLLP (Data Link Layer Packet)
Rollover 0         # 计数器翻转(长时间运行后正常)
Timeout 0          # 超时
NonFatalErr 0      # 非致命错误
CorrIntErr 0       # 内部可纠正错误
HeaderOF 0         # Header 日志溢出
TOTAL_ERR_COR 0    # 可纠正错误总计:0
# 致命错误 — 全部为 0
cat /sys/bus/pci/devices/0000:98:00.0/aer_dev_fatal
Undefined 0        # 未定义错误
DLP 0              # Data Link Protocol 错误
SDES 0             # Surprise Down 错误
TLP 0              # TLP 致命错误(如 Poisoned TLP)
FCP 0              # Flow Control Protocol 错误
CmpltTO 0          # Completion Timeout
CmpltAbrt 0        # Completer Abort
UnxCmplt 0         # Unexpected Completion
RxOF 0             # Receiver Overflow
MalfTLP 0          # Malformed TLP
ECRC 0             # ECRC 校验失败
UnsupReq 0         # Unsupported Request
ACSViol 0          # ACS 违反
UncorrIntErr 0     # 内部无法纠正错误
BlockedTLP 0       # 被阻止的 TLP
AtomicOpBlocked 0  # 被阻止的 Atomic 操作
TOTAL_ERR_FATAL 0  # 致命错误总计:0

3. nvidia-smi 侧 PCIe 指标

3.1 Replay 计数器

nvidia-smi -q -i 0 | grep -A3 "Replay"
Replays Since Reset     : 0
Replay Number Rollovers : 0
  • Replay:PCIe 链路层检测到错误后重传 TLP 的次数。增长意味着信号质量问题。
  • Rollover:Replay 计数器溢出次数。非零说明链路曾经历大量重传。

3.2 实时吞吐

nvidia-smi -q -i 0 | grep -A2 "Throughput"
Tx Throughput : 714 KB/s   (当前上行)
Rx Throughput : 525 KB/s   (当前下行)

空闲时吞吐量很低(KB/s 级别),负载下可达 GB/s 级别。


4. 链路健康诊断流程

nvidia-smi -q → Replays > 0?
  ├── YES → 检查 AER 计数器 → 对应章节排查
  └── NO  → 链路健康 ✅

sysfs aer_dev_* → 非零计数?
  ├── Correctable 增长
  │     → 通常信号质量下降:检查线缆、插槽、PCIe 延长线
  │     → 如果 Rollover 频繁 → 需要降低 PCIe Gen
  ├── Fatal/Non-Fatal
  │     → 严重问题:检查驱动、固件、GPU 硬件状态
  │     → UnsupReq → 驱动/Firmware 兼容性问题
  │     → CmpltTO → GPU 无响应,检查供电和散热
  └── ALL 0 → 链路完美

4.1 常见错误场景

错误类型 计数器 可能原因 排查
信号劣化 BadDLLP, RxErr, Replay 增长 PCIe 延长线质量差、插槽接触不良 换槽/降 Gen
链路不稳定 BadTLP, Replay 频繁 时钟偏差、EMI 干扰 检查 BIOS PCIe 展频设置
驱动/FW BUG UnsupReq GPU 驱动与内核不匹配 更新驱动
供电不足 CmpltTO GPU 瞬时功耗过高 检查电源/功耗限制
ACS 配置错误 ACSViol IOMMU/ACS 配置错误 检查 BIOS VT-d/ACS 设置
Atomic 被阻止 AtomicOpBlocked PCIe switch 不支持 atomic 检查 PCIe topology

4.2 定期监控脚本

#!/bin/bash
# 每分钟记录一次 PCIe 链路健康状态
GPU_BDF="0000:98:00.0"
while true; do
    echo "$(date -Iseconds) | Replay: $(nvidia-smi -q -i 0 | grep 'Replays Since Reset' | awk '{print $NF}') | Corr: $(cat /sys/bus/pci/devices/$GPU_BDF/aer_dev_correctable | grep TOTAL | awk '{print $NF}') | Fatal: $(cat /sys/bus/pci/devices/$GPU_BDF/aer_dev_fatal | grep TOTAL | awk '{print $NF}')"
    sleep 60
done

5. 其他 PCIe 健康指标

5.1 PCIe 链路协商

# 当前速度 vs 最大能力
cat /sys/bus/pci/devices/0000:98:00.0/current_link_speed
cat /sys/bus/pci/devices/0000:98:00.0/max_link_speed

如果 current 持续低于 max 且 GPU 有负载,说明链路训练失败降级。

5.2 ASPM (Active State Power Management) 状态

ASPM 是 PCIe 规范的省电机制,允许空闲链路进入低功耗状态(L0s/L1)。GPU 驱动通常禁用此功能以保证低延迟响应。

cat /sys/bus/pci/devices/0000:98:00.0/power/runtime_status
# active / suspended

GPU 的 runtime_status 通常为 activeruntime_enabled 通常为 forbidden(GPU 不允许 PCIe 休眠)。


6. 本环境结论

指标 判定
AER Correctable Total 0 ✅ 完美
AER Fatal Total 0 ✅ 完美
AER Non-Fatal Total 0 ✅ 完美
Replays Since Reset 0 ✅ 完美
当前 PCIe Gen / Width Gen 5 x16 (负载下) ✅ 全速
RxErr / BadTLP / BadDLLP 0 / 0 / 0 ✅ 信号完美

链路质量理想——无错误、无重传、全速协商。


参考