mcelog系统硬件诊断日志搜集工具

发现mcelog

在维护Linux服务器时,有时候你会看到系统cron定时执行了一个名为mcelog的程序。

默认配置 /etc/cron.hourly/mcelog.cron 每小时执行一次。

这个定时脚本是软件包 mcelog安装的,这个工具mcelog目前仍在持续开发维护,可以从内核工具GitHub andikleen/mcelog 获得。

mcelog简介

mcelog记录了在现代x86 Linxu系统上的硬件的主机检查(主要是内存,IO和CPU的硬件错误)日志。当硬件报告了主机自检错误,内核会立即执行操作(例如杀死进程等)然后mcelog就会解码这些错误并且进行一些高级的错误响应,例如屏蔽故障的内存、CPU,或者触发事件。另外,mcelog也能够通过记录日志来处理修正后的错误。

mcelog主要用来处理主机自检和温控事件(温控事件由CPU监测并报告错误)。

32位x86 Linux内核(从2.6.30开始)和64位 Linux内核(2.6内核系统的早期开始)都需要mcelog来记录主机检查和运行在所有需要错误处理的Linux主机上。

mcelog服务记录内存各种途径搜集的其它错误。mcelog --client命令可以用来查询一个运行的mcelog服务。这个服务也可以在可配置的阀值到达时触发一些动作。这对于一些自动化预测故障分析算法:包括坏页下线和自动化的缓存错误处理。用户也可以配置自己定义的动作

所有的错误都被记录到/var/log/mcelogsyslogjournal中。

这里主机检查是指通过硬件自己检查出来的硬件故障并通过软件报告出来。

对于内存错误,mclog支持x86系统的集成的内存控制器;也支持所有现代的x86系统的cpu错误。

传统上mcelog是通过cron定时任务运行,但是这种方式现在已经不再适用。现在运行mcelog的方法是在启动操作系统时作为daemon运行。另外,mcelog也用于在命令行解码故障主机检查,不过,通常并不需要,因为现在内核可以在重启后自动完成日志记录。

mcelog运行在daemon模式,它就可以持续在后台监视和等待错误发生,这是最快发现故障也是功能最全的运行方式。建议使用daemon模式运行mcelog,因为一些新功能(如内存页错误的预测故障分析)需要持续运行在daemon模式。

触发器(trigger)是内核在一个错误发生时运行mcelog的一种新的方式。这个配置是通过 echo /usr/sbin/mcelog > /sys/devices/system/machinecheck/machinecheck0/trigger 来配置的。

默认没有配置/sys/devices/system/machinecheck/machinecheck0/trigger,这时这个内容是空的。当将/usr/sbin/mcelog添加到这个proc文件中,就会在内核错误发生时触发运行/usr/sbin/mcelog来处理解码错误日志,方便排查故障。

内核编译配置CONFIG_XEN_MCE_LOG允许内核从Xen平台获取MCE错误并转换成Linux mcelog格式用于mcelog工具。

mcelog操作需要/dev/mcelog设备,这个设备通常自动由udev创建,也可以通过手工命令创建mknod /dev/mcelog c 10 227。设备创建后剋通过ls -lh /dev/mcelog检查:

crw------- 1 root root 10, 227 Jan 27 00:59 /dev/mcelog

安全

mcelog需要使用root身份运行,因为它需要出发动作,如page-offlining,这要求CAP_SYS_ADMIN。并且它需要打开设备/dev/mcelog和一个用于支持客户端的unix socket。

mcelog运行在daemon模式,它会监听在一个unix socket上并处理mcelog --client的请求。默认会检查请求的uid/gid并且默认是0/0,可配置。客户端处理和相应是由daemon的完整的特权处理的。

mcelog.conf

/etc/mcelog/mcelog.confmcelog配置文件

CentOS 7上的mcelog

在RHEL 7.x平台,已经舍弃了使用cron方式运行mcelog程序的方法,而改为系统启动时运行mcelog.service服务进程。使用ps命令可以检查到系统运行了如下mcelog服务

/usr/sbin/mcelog --ignorenodev --daemon --syslog
--ignorenodev       Exit silently when the device cannot be opened
--daemon            Run in background waiting for events (needs newer kernel)
--syslog            Log decoded machine checks in syslog (default stdout or syslog for daemon)

案例

通常检查系统硬件故障,可以直接使用mcelog客户端

sudo mcelog

例如下面案例输出显示系统内存故障

MCE 0
HARDWARE ERROR. This is *NOT* a software problem!
Please contact your hardware vendor
Thu Mar 24 16:15:20 2016
CPU 15 BANK 7 MISC 5262be86 ADDR 7f594d80
STATUS cc1f1dc000010091 MCGSTATUS 0
CPUID Vendor Intel Family 6 Model 62
WARNING: SMBIOS data is often unreliable. Take with a grain of salt!
<24> DIMM 1600 Mhz Res13 Width 72 Data Width 64 Size 16 GB
Device Locator: CPU0_A0
Bank Locator: CPU0_Bank0
Manufacturer: Samsung
Serial Number: 1331F1A9
Asset Tag: Dimm0_AssetTag
Part Number: M393B2G70QH0-YK0
MCE 1
HARDWARE ERROR. This is *NOT* a software problem!
Please contact your hardware vendor
Thu Mar 24 16:15:20 2016
CPU 15 BANK 9 MISC 90840000000208c ADDR 4863b580
STATUS cc000150000800c0 MCGSTATUS 0
CPUID Vendor Intel Family 6 Model 62
<24> DIMM 1600 Mhz Res13 Width 72 Data Width 64 Size 16 GB
Device Locator: CPU0_A0
Bank Locator: CPU0_Bank0
Manufacturer: Samsung
Serial Number: 1331F1A9
Asset Tag: Dimm0_AssetTag
Part Number: M393B2G70QH0-YK0

only decoding architectural errors错误提示

使用比较新型的处理器的环境,执行mcelog可能会有如下报错

mcelog: Family 6 Model 4f CPU: only decoding architectural errors

上述硬件平台使用

cpu family    : 6
model        : 79
model name    : Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz

上述报错only decoding architectural errors表明mcelog不知道你的CPU,不能够解码该型号的特定错误,但是mcelog仍然能够将错误记录成raw(hex)格式。重要的错误通常是结构相关的,但是有些时候新的结构相关错误加入后,可能就不能看到它被解码。

可以尝试升级到最新的mcelog版本,通常可以支持新的硬件架构。

参考 I get a "only decoding architectural errors" message. Does mcelog log all errors?

参考

Last updated