Назад | Перейти на главную страницу

mcelog не запускает оборудование PUIAS 6.4 amd

Ребята,

Я полный Linux n00b. Я пытаюсь развернуть mcelog на одном из моих вычислительных узлов под управлением 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

бесплатный клон Red Hat 6.4 на оборудовании 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

Мой файл mcelog.conf более или менее установлен по умолчанию, за исключением того факта, что я хотел бы запустить mcelog как демон и регистрировать ошибки. Когда я запускаю mcelog

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

Однако модуль присутствует

[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

и загружен

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

Могу ли я что-нибудь сделать, чтобы mcelog заработал? Единственная ссылка, которую я нашел, - это эта ветка

http://lists.centos.org/pipermail/centos/2012-November/130226.html

mcelog не работает на этом процессоре AMD или новее (как показано на mcelog.c family >= 15). Та же проблема существует и для процессоров AMD EPYC.

Вместо mcelog используйте модуль ядра edac_mce_amd, который поместит журналы MCE в журнал ядра, который должен попасть на диск через системный журнал. Возможно, на этот раз mcelog загрузил этот модуль за вас, но я предлагаю загрузить его при загрузке другим способом, например /etc/initramfs-tools/modules файл для Linux на базе Debian и update-initramfs -u.

Но я не могу найти ничего, что говорило бы о формате такого журнала ... так что вот предположение, составленное из исходного кода Linux ...

в include/linux/printk.h, мы видим:

#define HW_ERR         "[Hardware Error]: "

в drivers/edac/mce_amd.c, мы видим такие вещи, начиная некоторый вывод с pr_emerge(HW_ERR ...):

pr_emerg(HW_ERR "MC0 Error: ");

И еще строки с pr_cont(...) но без HW_ERR.

Думаю, ты можешь искать "[Hardware Error]:" в ваших журналах. И, возможно, строки скажут edac_mce_amd слишком.

Вот правило, которое, я думаю, будет регистрировать первый pr_emerg, но не части pr_cont (см. Вот). Здесь я создал rsyslog.d правило, которое ищет "[Hardware Error]:". Но это будет соответствовать вещам, отличным от модуля 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

Для меня достаточно иметь только первую строку, так как я настрою сценарий мониторинга, который просто проверяет, что размер файла равен 0. Если кто-то знает, как это сделать правильно, прокомментируйте.

Поскольку вы используете семейство ЦП 21, сообщение очевидно: вы можете увидеть следующий код:

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 }