28.5. NVDIMM 故障排除
28.5.1. 使用 S.M.A.R.T 监控 NVDIMM 健康状况。
有些 NVDIMM 支持自监控、分析和报告技术(S.M.A.R.T.)接口来检索健康信息。
定期监控 NVDIMM 健康状况以防止数据丢失。如果 S.M.A.R.T. 报告 NVDIMM 健康状态的问题,请替换它,如 第 28.5.2 节 “检测和替换 Broken NVDIMM” 所述。
先决条件
- 在有些系统中,必须载入 acpi_ipmi 驱动程序才能检索健康信息:
#
modprobe acpi_ipmi
流程
- 要访问健康信息,请使用以下命令:
#
ndctl list --dimms --health ... { "dev":"nmem0", "id":"802c-01-1513-b3009166", "handle":1, "phys_id":22, "health": { "health_state":"ok", "temperature_celsius":25.000000, "spares_percentage":99, "alarm_temperature":false, "alarm_spares":false, "temperature_threshold":50.000000, "spares_threshold":20, "life_used_percentage":1, "shutdown_state":"clean" } } ...
28.5.2. 检测和替换 Broken NVDIMM
如果您在系统日志或者 S.M.A.R.T. 中发现与 NVDIMM 相关的错误消息,这可能意味着 NVDIMM 设备失败。在这种情况下,需要:
- 检测哪个 NVDIMM 设备失败,
- 备份存储的数据,以及
- 物理替换该设备。
过程 28.3. 检测和替换 Broken NVDIMM
- 要检测有问题的 DIMM,请使用以下命令:
# ndctl list --dimms --regions --health --media-errors --human
badblocks
字段显示哪些 NVDIMM 有问题。注意它在dev
字段中的名称。在以下示例中,名为nmem0
的 NVDIMM 有问题:例 28.1. NVDIMM 设备的健康状况
# ndctl list --dimms --regions --health --media-errors --human ... "regions":[ { "dev":"region0", "size":"250.00 GiB (268.44 GB)", "available_size":0, "type":"pmem", "numa_node":0, "iset_id":"0xXXXXXXXXXXXXXXXX", "mappings":[ { "dimm":"nmem1", "offset":"0x10000000", "length":"0x1f40000000", "position":1 }, { "dimm":"nmem0", "offset":"0x10000000", "length":"0x1f40000000", "position":0 } ], "badblock_count":1, "badblocks":[ { "offset":65536, "length":1, "dimms":[ "nmem0" ] } ], "persistence_domain":"memory_controller" } ] }
- 使用以下命令查找有问题的 NVDIMM 的
phys_id
属性:# ndctl list --dimms --human
在上例中,您知道nmem0
是有问题的 NVDIMM。因此,查找nmem0
的phys_id
属性。在以下示例中,phys_id
是0x10
:例 28.2. NVDIMM 的 phys_id 属性
# ndctl list --dimms --human [ { "dev":"nmem1", "id":"XXXX-XX-XXXX-XXXXXXXX", "handle":"0x120", "phys_id":"0x1c" }, { "dev":"nmem0", "id":"XXXX-XX-XXXX-XXXXXXXX", "handle":"0x20", "phys_id":"0x10", "flag_failed_flush":true, "flag_smart_event":true } ]
- 使用以下命令查找有问题的 NVDIMM 的内存插槽:
# dmidecode
在输出中,找到Handle
标识符与有问题的 NVDIMM 的phys_id
属性匹配的条目。Locator
字段列出了有问题的 NVDIMM 使用的内存插槽。在以下示例中,nmem0
设备与0x0010
标识符匹配,并使用DIMM-XXX-YYYY
内存插槽:例 28.3. NVDIMM 内存插槽列表
# dmidecode ... Handle 0x0010, DMI type 17, 40 bytes Memory Device Array Handle: 0x0004 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 125 GB Form Factor: DIMM Set: 1 Locator: DIMM-XXX-YYYY Bank Locator: Bank0 Type: Other Type Detail: Non-Volatile Registered (Buffered) ...
- 备份 NVDIMM 命名空间中的所有数据。如果您在替换 NVDIMM 前没有备份数据,当您从系统中删除 NVDIMM 时数据将会丢失。警告在某些情况下,比如 NVDIMM 完全无法正常工作,备份可能会失败。要防止这种情况,请使用 S.M.A.R.T 定期监控 NVDIMM 设备,如 第 28.5.1 节 “使用 S.M.A.R.T 监控 NVDIMM 健康状况。” 所述,并在它们中断前替换失败的 NVDIMM。使用以下命令列出 NVDIMM 上的命名空间:
# ndctl list --namespaces --dimm=DIMM-ID-number
在以下示例中,nmem0
设备包含namespace0.0
和namespace0.2
命名空间,您需要备份:例 28.4. NVDIMM 命名空间列表
# ndctl list --namespaces --dimm=0 [ { "dev":"namespace0.2", "mode":"sector", "size":67042312192, "uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "raw_uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "sector_size":4096, "blockdev":"pmem0.2s", "numa_node":0 }, { "dev":"namespace0.0", "mode":"sector", "size":67042312192, "uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "raw_uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "sector_size":4096, "blockdev":"pmem0s", "numa_node":0 } ]
- 以物理方式替换失效的 NVDIMM。