软错误与硬错误:宇宙射线真的会翻转内存位
内存出错分两类,处理方式完全不同。分不清这一点,会在故障判定时做出错误决策:把软错误当坏条换掉,或者把硬错误当偶发忽略掉。
软错误:位翻了,但硬件没坏
存储单元里的电荷被外来能量扰动,导致状态从 1 变 0 或反过来。硬件本身完好,重新写入正确数据后该单元继续正常工作。
成因主要有:
- 大气中子。宇宙射线在大气层里产生的次级中子,撞击硅原子产生电离,是地面环境软错误的主要来源。海拔越高通量越大,高原机房的软错误率明显高于平原;
- 封装材料里的微量放射性杂质发出的 alpha 粒子。现在材料纯度控制得好,这一项比过去小很多;
- 电路噪声耦合。行锤这类现象也属于扰动导致的翻转,但它有明确的访问模式成因。
硬错误:物理坏了
存储单元、外围电路、走线或焊点出现物理损伤,写什么读出来都不对,或者在特定条件下必错。它不会自己恢复,需要修复(PPR)或更换。
怎么区分
方法很直接:对报错地址重写正确数据再读回。
- 重写后正常,多次访问也正常,是软错误;
- 重写后仍错,或者反复出现在同一地址,是硬错误。
服务器上 ECC 日志能提供更多信息。同一物理地址反复出现可纠正错误,基本可以判定为硬错误的早期表现,应该安排处理而不是等它变成不可纠正错误。
发生率大概是什么量级
公开研究数据的差异很大,取决于工艺节点、海拔、屏蔽条件。量级上,大规模数据中心的实测研究普遍显示:可纠正错误的发生比不可纠正错误高一到两个数量级,而且错误在服务器之间的分布高度不均,少数机器贡献了大部分错误。
后半句的实际意义很重要:错误集中说明多数是硬错误相关的问题机器,而不是均匀分布的随机软错误。运维上应该识别并处理这些高错误率的机器,而不是把 ECC 报错当作背景噪声。
防护手段的分工
- ECC 处理单比特翻转,对软错误效果直接;
- 内存巡检(patrol scrub)主动遍历内存并纠正累积的软错误,防止两个软错误落在同一 codeword 变成不可纠正;
- 更强的编码(如 chipkill 类方案)能容忍整颗颗粒失效,对硬错误有效;
- 关键场景做内存镜像,代价是一半容量。
对测试和分级的意义
出厂测试主要针对硬错误,因为软错误是概率事件,短时间测试里遇到的概率很低,遇到了也不代表产品有缺陷。
但有一点要注意:颗粒的抗软错误能力和它的电荷余量有关。余量小的颗粒被扰动翻转的概率更高。所以裕量扫描的结果间接反映了软错误敏感度,余量偏小的条子不适合用在对数据完整性要求高的场景。