内存ECC纠错
ECC是什么?
ECC的全称是 Error Checking and Correction or Error correctionCoding,是一种用于差错检测和修正的算法。
NAND闪存在生产和使用中都会有坏块产生,BBM就是坏块的管理机制。
为了在使用过程中减少坏块的产生,通过2种方式进行预防:
1、利用磨损平衡(WL)提前预防坏块产生;
2、已经产生“坏块”的引入ECC,通过ECC对“坏块”进行有效检测及纠正。
如果操作时序和电路稳定性不存在问题,NAND闪存出错的时候一般不会造成整个Block或Page不能读取甚至全部出错,而是整个Page中只有一个或几个bit出错,这个时候ECC针对出错的bit进行检测和纠正。
从DDR5自带ECC功能来看就是在内存中增加存储芯片,这样能检测和纠正内存单元中的数据错误,同时也能够有效提高DRAM芯片良率。
奇偶校验
在ECC技术出现之前,内存中应用最多的另外一种错误检查技术,是奇偶校验位(Parity)技术。
奇偶校验,即Parity Check,根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验通常用于确定数据是否出错。
在数字电路中,最小的数据单位就是叫“比特(bit)”,也叫数据“位”,“比特”也是内存中的最小单位,它是通过“1”和“0”来表示数据高、低电平信号。
在数字电路中8个连续的比特是一个字节(byte),如:字节中某一存储数值(1、0、1、0、1、0、1、1)相加是5,结果奇数。
采用偶校验,校验位就定义为1,5+1=6为偶数;
对于奇校验,则为0,5+0=5奇数。
当CPU读取存储的数据时,会再次把前8位中存储的数据相加,计算结果是否与校验位相一致(即下面讲到的与ECC签名是否一致)。
但Parity(奇偶校验位)的不足是:当内存查到某个数据位有错误时,不能准确定位存在错误的数据位,也就不一定能修正错误。
而且当数据量大时,数据出错的几率也就越大,对于只能纠正简单错误的奇偶检验的方法就无法纠正,由此出现错误检查和纠正(Error Checking and CorrecTIng)。
ECC的运作原理:
ECC是在奇偶校验的基础上发展起来,与奇偶校验技术一样,ECC纠错技术也需要额外的空间来储存校正码,但其占用的位数跟数据的长度并非成线性关系。
具体来说,它是以8位数据、5位ECC码为基准,随后每增加一个8位数据只需另增加一位ECC码即可。
也就是说当数据位为16位时ECC位为6位,32位时ECC位为7位,数据位为64位时ECC位为8位,依此类推,数据位每增加一倍,ECC位只增加一位。
所以ECC有更多位数的校验位,容错能力更强。
查看是否有启EDAC模块
# find /lib/modules/$(uname -r) -name '*edac*'
开启并查看EDAC驱动程序
- 使用物理机执行
- 已安装rasdaemon
检查EDAC驱动程序的状态
1. 使用命令查看:# ras-mc-ctl --status
2. 如果显示未加载
1) # ras-mc-ctl --status
ras-mc-ctl: drivers not loaded.
2)检查edac模块是否加载
# lsmod |grep edac
输出为空
3)加载内核
x86:
# insmod /usr/lib/modules/4.19.90/kernel/drivers/edac/amd64_edac_mod.ko.xz
# lsmod |grep edac
amd64_edac_mod 36864 0
edac_mce_amd 32768 1 amd64_edac_mod
4)再次检查
# ras-mc-ctl --status
获取内存的CE计数
# grep "[0-9]" /sys/devices/system/edac/mc/mc*/csrow*/ch*_ce_count
输出类似
# grep "[0-9]" /sys/devices/system/edac/mc/mc*/csrow*/ch*_ce_count
内存正常情况
/sys/devices/system/edac/mc/mc0/csrow0/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow0/ch1_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow1/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow1/ch1_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow2/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow2/ch1_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow3/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow3/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow0/ch0_ce_count:0
最后一个数字不为0则是校验错误,例:
/sys/devices/system/edac/mc/mc1/csrow0/ch3_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow1/ch0_ce_count:198276530
/sys/devices/system/edac/mc/mc1/csrow1/ch1_ce_count:233266714
/sys/devices/system/edac/mc/mc1/csrow1/ch2_ce_count:0
查看内存布局
# ras-mc-ctl --layout
输出类似
# ras-mc-ctl --layout
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| mc0 | mc1 | mc2 |
| csrow0 | csrow1 | csrow2 | csrow3 | csrow0 | csrow1 | csrow2 | csrow3 | csrow0 | csrow1 | csrow2 | csrow3 | csrow0 | cs
----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
channel1: | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 163
channel0: | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 16384 MB | 163
----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
或
# ras-mc-ctl --layout
+-----------+
| mc0 |
----------+-----------+
memory31: | 0 MB |
memory30: | 32768 MB |
----------+-----------+
memory29: | 0 MB |
memory28: | 32768 MB |
----------+-----------+
memory27: | 0 MB |
memory26: | 32768 MB |
----------+-----------+
memory25: | 0 MB |
memory24: | 32768 MB |
----------+-----------+
memory23: | 0 MB |
memory22: | 32768 MB |
----------+-----------+
memory21: | 0 MB |
memory20: | 32768 MB |
----------+-----------+
memory19: | 0 MB |
memory18: | 32768 MB |
----------+-----------+
memory17: | 0 MB |
memory16: | 32768 MB |
----------+-----------+
memory15: | 0 MB |
memory14: | 32768 MB |
----------+-----------+
memory13: | 0 MB |
memory12: | 32768 MB |
----------+-----------+
memory11: | 0 MB |
memory10: | 32768 MB |
---------+-----------+
memory9: | 0 MB |
memory8: | 32768 MB |
---------+-----------+
memory7: | 0 MB |
memory6: | 32768 MB |
---------+-----------+
memory5: | 0 MB |
memory4: | 32768 MB |
---------+-----------+
memory3: | 0 MB |
memory2: | 32768 MB |
---------+-----------+
memory1: | 0 MB |
memory0: | 32768 MB |
---------+------------+
查看日志,可以确认是否ECC模块已发挥作用
# dmesg | grep ECC
输出类似
[ 39.890947] EDAC amd64: Node 0: DRAM ECC enabled.
[ 39.947001] EDAC amd64: Node 1: DRAM ECC enabled.
[ 40.008809] EDAC amd64: Node 2: DRAM ECC enabled.
[ 40.064882] EDAC amd64: Node 3: DRAM ECC enabled.
[ 40.109443] EDAC amd64: Node 4: DRAM ECC enabled.
[ 40.159722] EDAC amd64: Node 5: DRAM ECC enabled.
[ 40.238696] EDAC amd64: Node 6: DRAM ECC enabled.
[ 40.271722] EDAC amd64: Node 7: DRAM ECC enabled.
查看纠错提示,内存对应关系
注:UE、CE 分别为不可纠错和可纠错
# edac-util -rfull
mc0:csrow0:mc#0csrow#0channel#0:CE:0
mc0:csrow0:mc#0csrow#0channel#1:CE:0
mc0:csrow1:mc#0csrow#1channel#0:CE:0
mc0:csrow1:mc#0csrow#1channel#1:CE:0
mc0:csrow2:mc#0csrow#2channel#0:CE:0
mc0:csrow2:mc#0csrow#2channel#1:CE:0
mc0:csrow3:mc#0csrow#3channel#0:CE:0
mc0:csrow3:mc#0csrow#3channel#1:CE:0
mc0:noinfo:all:UE:0
mc0:noinfo:all:CE:0
mc1:csrow0:mc#1csrow#0channel#0:CE:0
mc1:csrow0:mc#1csrow#0channel#1:CE:0
mc1:csrow1:mc#1csrow#1channel#0:CE:0
mc1:csrow1:mc#1csrow#1channel#1:CE:0
mc1:csrow2:mc#1csrow#2channel#0:CE:0
mc1:csrow2:mc#1csrow#2channel#1:CE:0
mc1:csrow3:mc#1csrow#3channel#0:CE:0
mc1:csrow3:mc#1csrow#3channel#1:CE:0
mc1:noinfo:all:UE:0
mc1:noinfo:all:CE:0
mc2:csrow0:mc#2csrow#0channel#0:CE:0
mc2:csrow0:mc#2csrow#0channel#1:CE:0
mc2:csrow1:mc#2csrow#1channel#0:CE:0
mc2:csrow1:mc#2csrow#1channel#1:CE:0
mc2:csrow2:mc#2csrow#2channel#0:CE:0
mc2:csrow2:mc#2csrow#2channel#1:CE:0
mc2:csrow3:mc#2csrow#3channel#0:CE:0
mc2:csrow3:mc#2csrow#3channel#1:CE:0
mc2:noinfo:all:UE:0
mc2:noinfo:all:CE:0
mc3:csrow0:mc#3csrow#0channel#0:CE:0
mc3:csrow0:mc#3csrow#0channel#1:CE:0
mc3:csrow1:mc#3csrow#1channel#0:CE:0
mc3:csrow1:mc#3csrow#1channel#1:CE:0
mc3:csrow2:mc#3csrow#2channel#0:CE:0
mc3:csrow2:mc#3csrow#2channel#1:CE:0
mc3:csrow3:mc#3csrow#3channel#0:CE:0
mc3:csrow3:mc#3csrow#3channel#1:CE:0
mc3:noinfo:all:UE:0
mc3:noinfo:all:CE:0
mc4:csrow0:mc#4csrow#0channel#0:CE:0
mc4:csrow0:mc#4csrow#0channel#1:CE:0
mc4:csrow1:mc#4csrow#1channel#0:CE:0
mc4:csrow1:mc#4csrow#1channel#1:CE:0
mc4:csrow2:mc#4csrow#2channel#0:CE:0
mc4:csrow2:mc#4csrow#2channel#1:CE:0
mc4:csrow3:mc#4csrow#3channel#0:CE:0
mc4:csrow3:mc#4csrow#3channel#1:CE:0
mc4:noinfo:all:UE:0
mc4:noinfo:all:CE:0
mc5:csrow0:mc#5csrow#0channel#0:CE:0
mc5:csrow0:mc#5csrow#0channel#1:CE:0
mc5:csrow1:mc#5csrow#1channel#0:CE:0
mc5:csrow1:mc#5csrow#1channel#1:CE:0
mc5:csrow2:mc#5csrow#2channel#0:CE:0
mc5:csrow2:mc#5csrow#2channel#1:CE:0
mc5:csrow3:mc#5csrow#3channel#0:CE:0
mc5:csrow3:mc#5csrow#3channel#1:CE:0
mc5:noinfo:all:UE:0
mc5:noinfo:all:CE:0
mc6:csrow0:mc#6csrow#0channel#0:CE:0
mc6:csrow0:mc#6csrow#0channel#1:CE:0
mc6:csrow1:mc#6csrow#1channel#0:CE:0
mc6:csrow1:mc#6csrow#1channel#1:CE:0
mc6:csrow2:mc#6csrow#2channel#0:CE:0
mc6:csrow2:mc#6csrow#2channel#1:CE:0
mc6:csrow3:mc#6csrow#3channel#0:CE:0
mc6:csrow3:mc#6csrow#3channel#1:CE:0
mc6:noinfo:all:UE:0
mc6:noinfo:all:CE:0
mc7:csrow0:mc#7csrow#0channel#0:CE:0
mc7:csrow0:mc#7csrow#0channel#1:CE:0
mc7:csrow1:mc#7csrow#1channel#0:CE:0
mc7:csrow1:mc#7csrow#1channel#1:CE:0
mc7:csrow2:mc#7csrow#2channel#0:CE:0
mc7:csrow2:mc#7csrow#2channel#1:CE:0
mc7:csrow3:mc#7csrow#3channel#0:CE:0
mc7:csrow3:mc#7csrow#3channel#1:CE:0
mc7:noinfo:all:UE:0
mc7:noinfo:all:CE:0
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升