我们的服务器中的 DIMM 经常出现故障,并且系统日志中会出现以下错误:
5月7日 09:15:31 nolcgi303 内核:EDAC k8 MC0:常规总线错误:参与处理器(本地节点响应)、超时(无超时)内存事务类型(通用读取)、mem 或 i/o(mem 访问)、缓存级别(通用) 5月7日 09:15:31 nolcgi303 内核:MC0:CE 页 0xa0,偏移量 0x40,粒度 8,综合征 0xb50d,行 2,通道 0,标签“”:k8_edac 5月7日 09:15:31 nolcgi303 内核:MC0:CE - 没有可用信息:k8_edac 错误溢出设置 5月7日 09:15:31 nolcgi303 内核:EDAC k8 MC0:扩展错误代码:ECC chipkill x4 错误
我们可以使用 HP SmartStart CD 来确定哪个 DIMM 有错误,但这需要让服务器停止生产。有没有一种巧妙的方法可以在服务器启动时找出哪个 DIMM 出现故障?我们所有的服务器都是运行 RHEL 5 的 HP 硬件。
答案1
除了使用 EDAC 代码外,您还可以使用 CLI 版 HP 实用程序在机器在线时确定这一点。Cli 版本比基于 Web 的版本轻量得多,并且不需要您打开端口或让守护程序持续运行。
hpasmcli 将为您提供故障模块的卡盒和模块编号。比分析 EDAC 稍快一点。
例子:
hpasmcli -s "show dimm"
DIMM Configuration
------------------
Cartridge #: 0
Module #: 1
Present: Yes
Form Factor: 9h
Memory Type: 13h
Size: 1024 MB
Speed: 667 MHz
Status: Ok
Cartridge #: 0
Module #: 2
Present: Yes
Form Factor: 9h
Memory Type: 13h
Size: 1024 MB
Speed: 667 MHz
Status: Ok
Cartridge #: 0
Module #: 3
Present: Yes
Form Factor: 9h
Memory Type: 13h
Size: 1024 MB
Speed: 667 MHz
Status: Ok
Cartridge #: 0
Module #: 4
Present: Yes
Form Factor: 9h
Memory Type: 13h
Size: 1024 MB
Speed: 667 MHz
Status: Ok
失败的模块的状态将会改变。
答案2
MC0、第 2 行和通道 0 很重要。尝试更换 CPU0 上的 DIMMA1。
举例来说,我必须在一台具有 16 个满载 DIMM 插槽和两个 CPU 的 Linux 服务器中识别出一个坏的 DIMM。这些是我在控制台上看到的错误:
EDAC k8 MC1: general bus error: participating processor(local node origin), time-out(no timeout) memory transaction type(generic read), mem or i/o(mem access), cache level(generic)
EDAC MC1: CE page 0x103ca78, offset 0xf88, grain 8, syndrome 0x9f65, row 1, channel 0, label "": k8_edac
EDAC MC1: CE - no information available: k8_edac Error Overflow set
EDAC k8 MC1: extended error code: ECC chipkill x4 error
我的服务器中损坏的 DIMM 是 CPU1 上的 DIMMA0。
EDAC 代表错误检测与纠正,记录在http://www.kernel.org/doc/Documentation/edac.txt以及我的系统 (RHEL5) 上的 /usr/share/doc/kernel-doc-2.6*/Documentation/drivers/edac/edac.txt。CE 代表“可纠正错误”,如文档所示,“CE 提供 DIMM 即将发生故障的早期迹象。”
回到我在服务器控制台上看到的上述 EDAC 错误,MC1(内存控制器 1)表示 CPU1,行 1 在 Linux EDAC 文档中称为 csrow1(芯片选择行 1),通道 0 表示内存通道 0。我查看了以下图表:http://www.kernel.org/doc/Documentation/edac.txt看到 csrow1 和通道 0 对应于 DIMM_A0(我的系统上为 DIMMA0):
Channel 0 Channel 1
===================================
csrow0 | DIMM_A0 | DIMM_B0 |
csrow1 | DIMM_A0 | DIMM_B0 |
===================================
===================================
csrow2 | DIMM_A1 | DIMM_B1 |
csrow3 | DIMM_A1 | DIMM_B1 |
===================================
(再举一个例子,如果我发现 MC0、csrow4 和通道 1 上出现错误,我会更换 CPU0 上的 DIMMB2。)
当然,我的服务器上实际上有两个称为 DIMMA0 的 DIMM 插槽(每个 CPU 一个),但 MC1 错误再次对应于 CPU1,它在 dmidecode 的输出中的“Bank Locator”下列出:
[root@rce-8 ~]# dmidecode -t memory | grep DIMMA0 -B9 -A8
Handle 0x002E, DMI type 17, 27 bytes.
Memory Device
Array Handle: 0x002B
Error Information Handle: Not Provided
Total Width: 72 bits
Data Width: 64 bits
Size: 4096 MB
Form Factor: DIMM
Set: None
Locator: DIMMA0
Bank Locator: CPU0
Type: DDR2
Type Detail: Synchronous
Speed: 533 MHz (1.9 ns)
Manufacturer:
Serial Number:
Asset Tag:
Part Number:
--
Handle 0x003E, DMI type 17, 27 bytes.
Memory Device
Array Handle: 0x002B
Error Information Handle: Not Provided
Total Width: 72 bits
Data Width: 64 bits
Size: 4096 MB
Form Factor: DIMM
Set: None
Locator: DIMMA0
Bank Locator: CPU1
Type: DDR2
Type Detail: Synchronous
Speed: 533 MHz (1.9 ns)
Manufacturer:
Serial Number:
Asset Tag:
Part Number:
(在我的工作站上,dmidecode 实际上显示了我的 DIMM 的零件编号和序列号,这非常有用。)
除了查看控制台和日志中的错误外,您还可以通过检查 /sys/devices/system/edac 查看每个 MC/CPU、row/csrow 和通道的错误。在我的例子中,错误仅出现在 MC1、csrow1、通道 0 上:
[root@rce-8 ~]# 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/mc0/csrow4/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow4/ch1_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow5/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow5/ch1_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow6/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow6/ch1_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow7/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow7/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow0/ch0_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow0/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow1/ch0_ce_count:6941652
/sys/devices/system/edac/mc/mc1/csrow1/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow2/ch0_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow2/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow3/ch0_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow3/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow4/ch0_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow4/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow5/ch0_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow5/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow6/ch0_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow6/ch1_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow7/ch0_ce_count:0
/sys/devices/system/edac/mc/mc1/csrow7/ch1_ce_count:0
我希望这个示例对任何试图根据 EDAC 错误识别坏 DIMM 的人有所帮助。有关更多信息,我强烈建议阅读以下所有 Linux EDAC 文档:http://www.kernel.org/doc/Documentation/edac.txt