Freqüentemente, os DIMMs em nossos servidores apresentam problemas com os seguintes erros no syslog:
7 de maio 09:15:31 kernel nolcgi303: EDAC k8 MC0: erro de barramento geral: processador participante (resposta do nó local), tempo limite (sem tempo limite) tipo de transação de memória (leitura genérica), mem ou i/o (acesso mem) , nível de cache (genérico) 7 de maio 09:15:31 nolcgi303 kernel: MC0: CE página 0xa0, deslocamento 0x40, grão 8, síndrome 0xb50d, linha 2, canal 0, rótulo "": k8_edac 7 de maio 09:15:31 nolcgi303 kernel: MC0: CE - nenhuma informação disponível: conjunto de estouro de erro k8_edac 7 de maio 09:15:31 nolcgi303 kernel: EDAC k8 MC0: código de erro estendido: ECC chipkill x4 erro
Podemos usar o CD HP SmartStart para determinar qual DIMM apresenta o erro, mas isso exige que o servidor saia da produção. Existe uma maneira astuta de descobrir qual DIMM falha enquanto o servidor está funcionando? Todos os nossos servidores são hardware HP executando RHEL 5.
Além de usar os códigos EDAC, você pode usar os utilitários CLI apenas da HP para determinar isso enquanto a máquina está online. As versões cli são muito mais leves do que as baseadas na web e não exigem que você abra portas ou tenha um daemon em execução constante.
hpasmcli fornecerá o cartucho e o número do módulo dos módulos com falha. Um pouco mais rápido do que analisar EDAC.
Exemplo:
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
O status mudará para módulos com falha.
MC0, linha 2 e canal 0 são significativos. Tente substituir DIMMA1 na CPU0.
A título de exemplo, tive que identificar um DIMM com defeito em um servidor Linux com 16 slots DIMM totalmente preenchidos e duas CPUs. Estes são os erros que vi no console:
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
O DIMM com defeito em meu servidor era DIMMA0 na CPU1.
EDAC significa Detecção e correção de erros e está documentado em http://www.kernel.org/doc/Documentation/edac.txt e /usr/share/doc/kernel-doc-2.6*/ Documentação/drivers/edac/edac.txt em meu sistema (RHEL5). CE significa "erros corrigíveis" e, como indica a documentação, "CEs fornecem indicações precoces de que um DIMM está começando a falhar".
Voltando aos erros EDAC acima, vi no console do meu servidor, MC1 (Controlador de memória 1) significa CPU1, linha 1 é referido como csrow1 (Chip-Select Row 1) na documentação do Linux EDAC, e canal 0 significa canal de memória 0 . Eu verifiquei o gráfico em http://www.kernel.org/doc/Documentation/edac.txt para ver se csrow1 e Canal 0 correspondem a DIMM_A0 (DIMMA0 em meu sistema):
Channel 0 Channel 1
===================================
csrow0 | DIMM_A0 | DIMM_B0 |
csrow1 | DIMM_A0 | DIMM_B0 |
===================================
===================================
csrow2 | DIMM_A1 | DIMM_B1 |
csrow3 | DIMM_A1 | DIMM_B1 |
===================================
(Como outro exemplo, se eu tivesse visto erros no MC0, csrow4 e Canal 1, eu teria substituído o DIMMB2 na CPU0.)
Claro, há realmente dois slots DIMM chamados DIMMA0 em meu servidor (um para cada CPU), mas novamente o erro MC1 corresponde a CPU1, que está listado em "Localizador de banco" na saída de dmidecode:
[[email protected] ~]# 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:
(Na minha estação de trabalho, dmidecode realmente mostra o número da peça e o número de série dos meus DIMMs, o que é muito útil.)
Além de verificar os erros no console e nos logs, você também pode ver os erros por MC/CPU, linha/csrow e canal examinando/sys/devices/system/edac. No meu caso, os erros ocorreram apenas em MC1, csrow1, canal 0:
[[email protected] ~]# 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
Espero que este exemplo seja útil para quem está tentando identificar um DIMM com defeito com base em erros EDAC. Para obter mais informações, recomendo a leitura de toda a documentação do Linux EDAC em http://www.kernel.org/doc/Documentation/edac.txt