必须立即定位aer错误根因:先用dmesg -t | grep -i "pcie\|aer" | tail -20确认高频触发(毫秒级时间戳),再通过lspci验证显卡aer支持性,提取bdf定位设备,结合type=physical/data link/transaction layer判断故障层级,最后用setpci或sysfs读取aer寄存器计数并执行物理隔离与aspm禁用等干预措施。

显卡因PCIe总线错误重传计数(AER)过高导致dmesg日志每秒刷屏、磁盘写满、监控告警频发,必须立即定位是链路物理劣化、GPU固件缺陷还是Root Complex配置异常。
确认AER错误是否真实爆发
执行dmesg -t | grep -i "pcie\|aer" | tail -20,观察是否出现连续重复的severity=Corrected或severity=Uncorrectable条目。若时间戳间隔稳定在毫秒级(如[12345.678901]→[12345.678912]),说明错误正在高频触发,不是偶发噪音。
运行lspci -vvv -s $(lspci | grep VGA | head -1 | awk '{print $1}') | grep -A 5 "Advanced Error Reporting",确认显卡设备确实支持AER能力。若输出为空或显示Advanced Error Reporting: not supported,则日志中的AER字样来自上游Root Port而非显卡本身,排查方向需上移至PCIe插槽对应的根端口。
提取错误源BDF与错误类型
从dmesg输出中提取形如0000:01:00.0的BDF地址——这是错误发生的精确位置。用该地址反查设备:lspci -s 0000:01:00.0 -mm,确认是否为你的目标显卡(Vendor ID应为10de(NVIDIA)或1002(AMD))。
重点识别日志中type=字段后的层级:若为Physical Layer,问题大概率出在金手指接触、PCB走线阻抗、主板供电纹波;若为Data Link Layer,则指向LCRC校验失败,常见于信号完整性恶化或链路训练参数不匹配;若为Transaction Layer,需怀疑GPU驱动提交了非法TLP或显存控制器返回毒化数据。
【务必核对BDF前缀与实际插槽物理位置一致】。例如BDF为0000:03:00.0却查到是NVMe盘,说明显卡实际插在0000:01:00.0而日志被上游端口转发,此时应检查0000:00:1c.0这类Root Port的AER状态寄存器。
读取并解析AER错误计数寄存器
方法一:用setpci直接读取设备AER状态寄存器
执行setpci -s 0000:01:00.0 100.w(AER Capability结构起始偏移为0x100)。正常值应为00000000;若高位非零(如00000001),对应bit0为RxErr(接收错误),bit4为BadTLP(畸形事务层包)。
方法二:查看内核暴露的sysfs接口
执行cat /sys/bus/pci/devices/0000:01:00.0/aer_dev_correctable和/sys/bus/pci/devices/0000:01:00.0/aer_dev_uncorrectable。两个文件内容均为十六进制数字,数值持续增长即证实硬件级错误累积。注意:该路径仅在内核启用CONFIG_PCIEAER=y且设备支持时存在。
方法三:用rasdaemon实时聚合
若已部署rasdaemon服务,执行ras-mc-ctl --summary。重点关注PCIe AER Correctable Errors和PCIe AER Uncorrectable Errors两栏的增量速率。单秒超过5次即属异常,需立即干预。
隔离物理层干扰源
第一步:拔掉显卡,用橡皮擦反复擦拭金手指,再用压缩空气吹净插槽内金属碎屑。重新安装后紧固螺丝,确保PCIe插槽簧片与金手指压力均匀。
第二步:更换PCIe插槽。将显卡移至主板另一条PCIe x16插槽(需确认该插槽直连CPU而非PCH),重启后观察dmesg错误是否消失。若消失,原插槽的PCB走线或供电模块存在隐性故障。
第三步:禁用ASPM节能。编辑/etc/default/grub,在GRUB_CMDLINE_LINUX中追加pcie_aspm=off,运行sudo update-grub && sudo reboot。ASPM在某些主板BIOS版本下会引发链路训练不稳定,表现为周期性Corrected错误激增。
第四步:检查GPU风扇与散热。用手轻触显卡散热鳍片,若温度超过75℃且风扇转速低于默认值,强制刷新VBIOS或更新GPU驱动可能缓解因热导致的PHY层误码。
验证Root Complex AER使能状态
执行lspci -vvv -s $(lspci | grep "PCI bridge" | grep -E "(Root|Upstream)" | head -1 | awk '{print $1}') | grep -A 10 "Advanced Error Reporting",找到Root Port设备(通常BDF为0000:00:xx.x)。
观察其AER Capability结构中的UESta(Uncorrectable Error Status)和UEMsk(Uncorrectable Error Mask)字段。若UEMsk中RxErr、BadTLP等位为+,表示对应错误被屏蔽,系统不会上报;若为-,则错误会透传至OS。当前日志爆满,说明这些位大概率是+,但需确认UESta对应位是否持续置1——若是,证明硬件确实在报错,而非软件误判。
执行setpci -s 0000:00:1c.0 410.w(Root Port AER寄存器偏移0x410为UESta),返回值非零即证实Root Complex已捕获错误。此时不可简单清零,否则掩盖真实故障。











