mcelog não falha ao iniciar o PUIAS 6.4 amd hardware

1

Gente,

Eu sou um n00b total do Linux. Eu estou tentando implantar mcelog em um dos meus nós de computação em execução PUIAS 6.4 (i86_64)

[root@lov3 edac]# uname -a
Linux lov3.mylab.org 2.6.32-358.18.1.el6.x86_64 #1 SMP Tue Aug 27 22:40:32 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux

um clone grátis do Red Hat 6.4 no hardware AMD

[root@lov3 mcelog]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                64
On-line CPU(s) list:   0-63
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             4
NUMA node(s):          8
Vendor ID:             AuthenticAMD
CPU family:            21
Model:                 2
Stepping:              0
CPU MHz:               1400.000
BogoMIPS:              4999.30
Virtualization:        AMD-V
L1d cache:             16K
L1i cache:             64K
L2 cache:              2048K
L3 cache:              6144K
NUMA node0 CPU(s):     0-7
NUMA node1 CPU(s):     8-15
NUMA node2 CPU(s):     16-23
NUMA node3 CPU(s):     24-31
NUMA node4 CPU(s):     32-39
NUMA node5 CPU(s):     40-47
NUMA node6 CPU(s):     48-55
NUMA node7 CPU(s):     56-63

Meu arquivo mcelog.conf é mais ou menos o padrão do fato de que eu gostaria de executar o mcelog como um daemon e registrar erros. Quando eu começo o mcelog

[root@lov3 mcelog]# mcelog --config-file mcelog.conf
AMD Processor family 21: Please load edac_mce_amd module.

No entanto, o módulo está presente

[root@lov3 mcelog]# locate edac_mce_amd.ko
/lib/modules/2.6.32-358.18.1.el6.x86_64/kernel/drivers/edac/edac_mce_amd.ko
/lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/edac/edac_mce_amd.ko

e carregado

[root@lov3 edac]# lsmod | grep mce       
edac_mce_amd           14705  1 amd64_edac_mod

Existe algo que eu possa fazer para que o mcelog funcione? A única referência que encontrei é este tópico

link

    
por Predrag Punosevac 27.10.2013 / 01:24

2 respostas

1

O mcelog não funciona nessa CPU AMD ou mais recente (como visto em mcelog.c family >= 15 ). O mesmo problema existe para processadores AMD EPYC.

Em vez de mcelog, use o módulo do kernel edac_mce_amd , que colocará os logs do MCE no log do kernel, que deve terminar no disco via syslog. É possível que o mcelog tenha carregado esse módulo para você desta vez, mas sugiro carregá-lo na inicialização de outra forma, como o arquivo /etc/initramfs-tools/modules no Linux baseado em Debian e update-initramfs -u .

Mas eu não consigo encontrar nada dizendo o formato de tal log ... então aqui está um palpite sobre o código-fonte do Linux ...

em include/linux/printk.h , vemos:

#define HW_ERR         "[Hardware Error]: "

em drivers/edac/mce_amd.c , vemos coisas assim começando alguma saída com pr_emerge(HW_ERR ...) :

pr_emerg(HW_ERR "MC0 Error: ");

E mais linhas com pr_cont(...) , mas sem HW_ERR .

Então, eu acho que você pode procurar por "[Hardware Error]:" em seus registros. E talvez as linhas digam edac_mce_amd também.

Aqui está uma regra que eu acho que vai registrar o primeiro pr_emerg, mas não as partes do pr_cont (veja aqui ). Aqui, eu configuro uma regra rsyslog.d que procura "[Hardware Error]:" . Mas isso vai combinar com outras coisas além do módulo edac_mce_amd.

vim /etc/rsyslog.d/09-edac_mce_amd.conf

if  ($syslogfacility-text == 'kern') and \
($msg contains '[Hardware Error]:') \
then    -/var/log/edac_mce_amd.log
#uncomment this to also remove it from the other files
#&   stop

Ter apenas a primeira linha é boa o suficiente para mim, pois configurarei um script de monitoramento que simplesmente verifica se o tamanho do arquivo é 0. Se alguém souber uma maneira de fazer isso corretamente, comente.

    
por 14.11.2017 / 14:48
0

Como você está usando a família de CPU 21, a mensagem é óbvia: você pode ver o código abaixo:

mcelog.c of the mcelog-1.0pre3_20110718-0.14.el6 package show where the cpu family of greater than 15 returns 0 to is_cpu_supported():

 416 int is_cpu_supported(void)
 417 {
 418         enum {
 419                 VENDOR = 1,
 420                 FAMILY = 2,
 421                 MODEL = 4,
 422                 MHZ = 8,
 423                 FLAGS = 16,
 424                 ALL = 0x1f
 425         } seen = 0;
 426         FILE *f;
 427         static int checked;
 428 
 429         if (checked)
 430                 return 1;
 431         checked = 1;
 432 
 433         f = fopen("/proc/cpuinfo","r");
 434         if (f != NULL) {
 435                 int family = 0;
 436                 int model = 0;
 437                 char vendor[64] = { 0 };
 438                 char *line = NULL;
 439                 size_t linelen = 0;
 440                 double mhz;
 441 
 442                 while (getdelim(&line, &linelen, '\n', f) > 0 && seen != ALL) {
 443                         if (sscanf(line, "vendor_id : %63[^\n]", vendor) == 1)
 444                                 seen |= VENDOR;
 445                         if (sscanf(line, "cpu family : %d", &family) == 1)
 446                                 seen |= FAMILY;
 447                         if (sscanf(line, "model : %d", &model) == 1)
 448                                 seen |= MODEL;
 449         /* We use only Mhz of the first CPU, assuming they are the same
 450                (there are more sanity checks later to make this not as wrong
 451                            as it sounds) */
 452                         if (sscanf(line, "cpu MHz : %lf", &mhz) == 1) {
 453                                 if (!cpumhz_forced)
 454                                         cpumhz = mhz;
 455                                 seen |= MHZ;
 456                         }
 457                         if (!strncmp(line, "flags", 5) && isspace(line[6])) {
 458                                 processor_flags = line;
 459                                 line = NULL;
 460                                 linelen = 0;
 461                                 seen |= FLAGS;
 462                         }
 463  
 464                 }
 465                 if (seen == ALL) {
 466                         if (!strcmp(vendor,"AuthenticAMD")) {
 467                                 if (family == 15)
 468                                         cputype = CPU_K8;
 469                                 if (family >= 15)  <-----------
 470                                        fprintf(stderr, "AMD Processor family %d: Please load edac_mce_amd module.\n", f     amily);
 471                                 return 0;
 472                         } else if (!strcmp(vendor,"GenuineIntel"))
 473                                 cputype = select_intel_cputype(family, model);
 474                         /* Add checks for other CPUs here */
 475                 } else {
 476                         Eprintf("warning: Cannot parse /proc/cpuinfo\n");
 477                 }
 478                 fclose(f);
 479                 free(line);
 480         } else
 481                 Eprintf("warning: Cannot open /proc/cpuinfo\n");
 482 
 483         return 1;
 484 }
    
por 29.01.2014 / 07:18