Notes about Error Check Scrub (ECS)
文章目录
本文将mark下Error Check Scrub (ECS)的相关notes。
Prerequisite
Overview
ECS 会在 DRAM 内部依次检查存储阵列中的数据:
1 | 从 DRAM 阵列读出一个内部数据块 |
ECS 读取内部数据;若发现可纠正错误,就把纠正后的数据重新写回。它可以由命令手动启动,也可以由 DRAM 自动调度执行。
What
可以把ECS理解成:
DDR5 DRAM 芯片内部自带的一套“巡检 + 纠错 + 回写 + 记账”机制。
ECS有点像内存控制器的Patrol Scrub,但 ECS 运行在 DRAM 芯片内部,使用的是 DDR5 的 On-Die ECC。
Why
假设 DRAM 中保存的是:
1 | 原始正确数据:10110010 |
普通读取时,On-Die ECC 可以临时纠正:
1 | 阵列中的错误数据 |
但这里有一个问题:
向 CPU 输出正确数据,不一定意味着阵列中原来的错误已经被清掉。
如果错误数据长期留在阵列里,之后同一内部 ECC 保护块中又出现第二个错误,单比特纠错能力就可能不够。
ECS 因此会进一步执行:
1 | 读出错误数据 |
这叫 scrub。它的主要作用是防止多个潜伏错误逐渐累积。
How
Allows the DRAM to:
- internally read
- correct single-bit errors
- write back corrected data bits to the DRAM array
error counts
虽然错误在 DRAM 内部被纠正了,但 DRAM仍可以把错误统计信息暴露出来。
如果没有 ECS 统计,系统可能看到:
1 | CPU 每次读取的数据都是正确的 |
实际上可能是:
1 | DRAM 内部已经纠正了大量单比特错误 |
ECS 让管理软件能够知道:
- 扫描期间纠正了多少错误
- 有多少行或内部数据块出现过错误
- 哪一行的错误最多
- 是否已经超过设定阈值
因此,ECS 在一定程度上弥补了 On-Die ECC 带来的“错误不可见”问题。在完整扫描后,DDR5 可以报告已纠正错误数量,并报告错误数量最多的行。
ECS threshold count
它是一个报告门槛。
例如,假设阈值设置为 256:
1 | 错误计数 < 256 |
设置阈值是为了避免一个偶发单比特错误就不断产生告警。
它通常用于回答:
这颗 DRAM 中被纠正的小错误是否已经多到值得关注?
控制接口还可以配置是统计“出现错误的行”,还是统计“出现错误的内部 ECC 数据块”。
需要注意:
阈值主要控制统计和报告策略,不是说超过阈值之后 ECS 才开始纠错。
ECS 扫描时发现可纠正错误,就会进行纠正;阈值更多决定何时将其视作值得报告的可靠性事件。
When
主要有两种方式。
自动模式
DRAM 自己安排 ECS 操作:
1 | 正常运行 |
自动模式由 DRAM 调度 ECS,以在建议的 24 小时周期内完成一次数据阵列扫描。
手动模式
内存控制器或固件向 DRAM 发出命令,要求执行 ECS:
1 | 内存控制器 |
手动模式适合:
- 启动时检测
- 维护窗口
- 管理员主动诊断
- 发现异常后提高扫描力度
所以 mode of operation 本质上是在选择:
1 | 由 DRAM 自动安排 |
Reset the ECS counter
就是清空本轮 ECS 统计信息,例如:
- 错误总数
- 超过阈值的状态
- 错误最多的行
- 该行的错误数量
- 相关地址信息
例如:
1 | 过去一周: |
它不是关闭 ECS,也不是关闭 On-Die ECC。
清零之后,系统可以判断:
- 错误是否继续增长
- 某次维修是否有效
- 错误是一次性事件还是持续性缺陷
总结
ECS 是 DDR5 DRAM 内部的主动巡检机制:它周期性读取内部数据,用 On-Die ECC 纠正单比特错误,把正确数据写回,并记录错误数量及高风险行。
最关键的价值有两个:
- 清除潜伏错误,防止错误累积成不可纠正错误
- 把原本被 On-Die ECC 隐藏的错误,以计数或日志形式暴露给系统
参考资料: