Ребята,
Я полный 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 }