一、故障背景
2026年Q2,某中型OEM厂商的一批AI推理服务器在产线测试阶段出现异常。该批次共200台服务器,配置为双路Intel Xeon Gold 6430处理器、16条64GB DDR5-5600 RDIMM、三星PM9A3 NVMe SSD。
首批50台在满载老化测试中,有12台出现间歇性宕机。故障现象不规律,单台服务器每天约出现1-2次,重启后可正常运行数小时至数天。由于故障率约24%,且无法稳定复现,产线和品质团队一度陷入排查困境。
本文完整复盘从现象到根因的排查路径,供硬件工程师和品质团队参考。
下面是本次故障排查的整体流程:
二、第一阶段:现象收集与初步分类
2.1 故障现象汇总
品质团队对12台故障机的现象进行了系统收集:
| 故障编号 | 现象 | 频率 | 可复现性 |
|---|---|---|---|
| F-01至F-05 | 系统无预警重启 | 1-2次/天 | 无法主动复现 |
| F-06至F-08 | 系统蓝屏,错误码WHEA_UNCORRECTABLE_ERROR | 1次/1-2天 | 无法主动复现 |
| F-09至F-10 | 内存ECC错误计数异常升高,系统降级运行 | 持续 | 可观察但不可控 |
| F-11至F-12 | 开机自检时报内存Training Fail,随机槽位 | 约30%开机概率 | 部分可复现 |
2.2 初步判断
WHEA_UNCORRECTABLE_ERROR是Windows平台典型的硬件错误码,通常指向CPU、内存或PCIe设备的硬件故障。结合部分机器出现内存Training Fail和ECC错误计数升高,初步将排查方向锁定在内存子系统。
但关键问题是:同批次内存共3200条(200台×16条),为何只有12台出现故障?如果是内存本身的质量问题,故障率应该更高;如果是平台兼容性问题,为何75%的机器完全正常?
三、第二阶段:单变量替换排除
3.1 内存替换实验
选取故障机F-01,执行以下替换实验:
| 实验 | 操作 | 结果 | 结论 |
|---|---|---|---|
| 1 | 将F-01的全部16条内存换到正常机N-01 | N-01在48小时内出现2次宕机 | 故障随内存转移 |
| 2 | 将正常机N-01的16条内存换到F-01 | F-01在72小时内无故障 | 故障不随平台转移 |
| 3 | 逐条替换F-01的内存,定位故障条 | 定位到第7槽和第12槽的内存条 | 单条内存故障 |
结论:F-01的故障由第7槽和第12槽的两条内存引起,故障随内存转移。
3.2 扩大验证
对12台故障机逐台执行同样的替换实验,共定位到19条异常内存条。将19条异常内存条与同批次随机抽取的19条正常内存条进行对比分析。
| 对比维度 | 异常内存条(19条) | 正常内存条(19条) |
|---|---|---|
| 品牌 | 三星 | 三星 |
| 型号 | M321R8GA0PB0-CWM | M321R8GA0PB0-CWM |
| 批次号 | 集中在3个批次 | 分散在8个批次 |
| 外观 | 无明显异常 | 无明显异常 |
| 单条memtest86 | 2条报错,17条通过 | 全部通过 |
| 满载memtest86 | 8条报错 | 全部通过 |
关键发现:19条异常内存条中,有17条在单条测试时通过,但在满载测试时报错。这说明故障与满载配置下的信号完整性有关,而非内存条本身的硬性损坏。
四、第三阶段:根因分析
4.1 批次一致性核查
将19条异常内存条的批次号与同批次全部3200条内存的批次分布进行对比:
| 批次号 | 总数量 | 异常数量 | 异常率 |
|---|---|---|---|
| LOT-A | 400条 | 8条 | 2.0% |
| LOT-B | 400条 | 7条 | 1.75% |
| LOT-C | 400条 | 4条 | 1.0% |
| 其他5个批次 | 2000条 | 0条 | 0% |
异常集中在3个批次,异常率1%-2%。其他5个批次的2000条内存零故障。
进一步核查发现,这3个批次的颗粒版本为“A0”,而其他5个批次的颗粒版本为“A3”。三星M321R8GA0PB0-CWM的“A0”颗粒版本与“A3”颗粒版本在电气特性上存在差异,尤其是在ODT(片上终端电阻)策略和驱动强度上。
4.2 ODT策略差异分析
DDR5将终端电阻集成到DRAM芯片内部,ODT策略由颗粒版本和SPD参数共同决定。不同颗粒版本的ODT默认值可能不同。
| 颗粒版本 | ODT默认策略 | 驱动强度 | 信号裕量 |
|---|---|---|---|
| A0 | 策略A(较高ODT值) | 中等 | 在满载配置下裕量不足 |
| A3 | 策略B(优化ODT值) | 中等 | 满载配置下裕量充足 |
在16条满载配置下,A0颗粒版本的信号完整性裕量不足,导致部分内存条在特定负载模式下出现Training Fail或ECC错误。这解释了为何单条测试通过、满载测试报错——单条配置下信号负载轻,ODT策略的差异被掩盖;满载配置下信号负载重,裕量不足的问题才暴露出来。
4.3 根因确认
根因:该批次服务器使用的三星M321R8GA0PB0-CWM内存中,混入了3个采用“A0”颗粒版本的批次。A0颗粒版本的ODT默认策略在16条满载配置下信号完整性裕量不足,导致部分内存条出现间歇性Training Fail和ECC错误,进而引发系统宕机和蓝屏。
下面是根因分析的逻辑推导图:
五、第四阶段:解决方案与验证
5.1 短期措施
- 隔离异常批次:将LOT-A、LOT-B、LOT-C三个批次的1200条内存全部隔离,逐条进行满载测试。
- 更换故障内存:对12台故障机的19条异常内存条进行更换,换用“A3”颗粒版本的批次。
- 全量筛查:对已出货的150台服务器进行远程ECC错误日志筛查,标记异常机器。
5.2 长期措施
- IQC流程更新:在来料检验中增加“满载memtest86”测试项,抽样比例不低于10%。单条测试通过不再作为放行依据。
- 批次一致性要求:同一订单的内存批次号应集中,避免多批次混用。
- 颗粒版本核对:在采购规格中明确要求颗粒版本,到货后核对标签上的颗粒版本字段。
- 供应商管理:要求供应商在发货前提供批次号和颗粒版本清单,并保证同批货物的颗粒版本一致。
5.3 验证结果
对隔离的1200条内存逐条进行满载测试后,确认异常内存条共27条(包括已定位的19条和新增的8条)。更换全部27条内存后,12台故障机在72小时满载老化测试中零故障。150台已出货服务器中,筛查出3台存在ECC错误计数升高,远程更换内存后恢复正常。
六、复盘总结
6.1 故障排查路径
| 阶段 | 关键动作 | 产出 |
|---|---|---|
| 现象收集 | 汇总故障现象,分类 | 锁定内存子系统 |
| 替换排除 | 内存与平台交叉替换 | 确认故障随内存转移 |
| 扩大验证 | 逐台定位,单条与满载对比 | 发现满载才报错的特征 |
| 根因分析 | 批次核查+颗粒版本对比 | 锁定A0颗粒版本的ODT问题 |
| 解决方案 | 隔离、更换、流程更新 | 故障消除,流程加固 |
6.2 关键教训
教训一:单条测试通过不等于满载可用。17条异常内存条在单条测试时全部通过,仅在满载时报错。如果IQC只做单条测试,这批物料会100%放行。
教训二:批次一致性比品牌更重要。同品牌、同型号的内存,不同颗粒版本在满载配置下的表现可能截然不同。批次一致性是信号完整性的基础保障。
教训三:ODT策略是DDR5时代的隐形变量。DDR4时代ODT由主板设计决定,DDR5时代ODT集成到颗粒内部,颗粒版本差异直接影响ODT默认值。替代料选型时必须将颗粒版本纳入核对清单。
6.3 改进清单
| 改进项 | 负责方 | 优先级 |
|---|---|---|
| IQC增加满载memtest86测试 | 品质部 | 高 |
| 采购规格中明确颗粒版本要求 | 采购部 | 高 |
| 供应商发货前提供批次和颗粒版本清单 | 采购部 | 高 |
| 建立颗粒版本与ODT策略对照表 | 硬件部 | 中 |
| 替代料选型流程纳入颗粒版本核对 | 硬件部 | 中 |
下面是本次故障的改进措施分类图:
七、小结
内存批量故障的排查,核心逻辑是先确认故障边界,再定位故障物料,最后分析根因。本案例中,故障率仅24%且无法稳定复现,排查难度在于“单条测试通过、满载测试报错”的隐蔽性。最终根因锁定在颗粒版本的ODT策略差异上,这是DDR5时代替代料选型中容易被忽略的变量。
对于批量部署的内存,建议在IQC环节增加满载测试,并在采购规格中明确颗粒版本和批次一致性要求。笔者所在团队(深圳市极光通讯科技有限公司)在配单和出库环节对内存批次进行核对,并在批量发货前提供批次号和颗粒版本清单,以支持客户的IQC流程。