共计 3131 个字符,预计需要花费 8 分钟才能阅读完成。
导读 | mcelog 是 Linux 系统上用来检查硬件错误,特别是内存和 CPU 错误的工具。未纠正的错误是关键异常,如果 CPU 无法恢复,往往会导致系统上的内核错误。这会导致应用程序重置和中断。对于未纠正的错误,mcelog 捕获错误的能力取决于错误导致热重启还是硬重启。如果是热重启,信息会被 mcelog 捕获,恢复后可看到。硬重启会导致数据丢失,而且 mcelog 可能捕获不到该事件。 |
安装
[root@RedHat_test ~]# yum install mcelog.x86_64
mcelog 的启动方式
cron : 最老的方式,有确定,定时任务,会丢失一些
daemon : el7 上用这种,守护进程的方式
trigger : 高级一点的方式,触发的时候,看 man mcelog
mcelog 相关文件
/dev/mcelog 设备文件
/var/log/mcelog messages 日志文件
/etc/mcelog/mcelog.conf 配置文件
/var/run/mcelog.pid
默认故障日志只记录在 /var/log/mcelog,并不记录到系统日志中。
如果需要在系统日志中也体现,需修改 /etc/mcelog/mcelog.conf 文件,将前面 #去掉,并保存。
mcelog 后台运行
[root@RedHat_test ~]# mcelog --daemon
查看系统是否异常
1. 手动运行 mcelog 的方式
[root@RedHat_test ~]# mcelog --daemon
查看 mcelog 日志
[root@RedHat_test ~]# tail /var/log/mcelog
# 什么也没有输出,表明正常
查看 mcelog 守护进程是否检测到错误信息
[root@RedHat_test ~]# mcelog --client
# 什么也没有输出,表明正常
解析系统异常时的 mcelog 输出
[root@RedHat_test ~]# mcelog --ascii < file.log
# or 或者
[root@RedHat_test ~]# mcelog --ascii --file file.log
测试
1. 修改 tolerate
mce-inject 用于测试 mcelog 能否正确的获取硬件错误信息,并进行正确解码,mce-inject 可以向内核注入指定的错误信息,因此,可以很方便的了解到 mcelog 的功能是否正常。
注意的是,当用户利用 mce-inject 工具向内核注入不可恢复错误(如:fatal)时,会发生死机重新启动等现象,当然,可以通过更改 sys 文件系统下的 tolerate 文件来避免此现象的发生。
[root@RedHat_test ~]# cd /sys/devices/system/machinecheck/machinecheck0
----------------------------------------------------------------------------------------
位置 : /sys/devices/system/machinecheck/machinecheck*/
说明 : 其中 machinecheck* 中的 * 号由 CPU 的个数所决定的,如果是双核的,则存在 machinecheck0 和 machinecheck1 两个目录,对应目录里都有一个 tolerate 文件,tolerate 中存放容忍程度值。功能 : 向用户提供一个可选择的出现相应硬件错误时的容忍程度(tolerate),比如:当 tolerate 的值为 1 时,出现 fatal 错误时就会死机,重新启动,并且该错误信息并不被记录;当 tolerate 的值为 3 时(注意该值只用于测试),在出现 fatal 错误时,机器会容忍该错误不予响应,不会出现死机重新启动现象,并且会记录相关错误信息。----------------------------------------------------------------------------------------
[root@RedHat_test machinecheck0]# cat tolerant
1
[root@RedHat_test machinecheck0]# echo 3 > tolerant
----------------------------------------------------------------------------------------
数值含义:tolerate 的取值可以为 0、1、2、3。0: always panic on uncorrected errors, log corrected errors
1: panic or SIGBUS on uncorrected errors, log corrected errors
2: SIGBUS or log uncorrected errors (if possible), log corrected errors
3: never panic or SIGBUS, log all errors (for testing only)
2. 安装
[root@RedHat_test ~]# yum install gcc.x86_64 gcc-c++.x86_64 flex.x86_64 dialog.x86_64 ras-utils.x86_64 git.x86_64 ras-utils
3. 捏造文件
[root@RedHat_test ~]# cat correct
CPU 1BANK 2
STATUS corrected
RIP 0x12341234
4. 加载 mce-inject 模块
[root@RedHat_test ~]# modprobe mce-inject
5. 在终端执行文件
[root@RedHat_test ~]# mce-inject ./correct
6. 查看 /var/log/mcelog,/var/log/messages
[root@RedHat_test ~]# tail /var/log/mcelog
TIME 1581565856Thu Feb 1311:50:56 2020
MCG status:
MCi status:
Corrected error
Error enabled
MCA: No Error
STATUS 9000000000000000MCGSTATUS 0
MCGCAP 100010a APICID 1SOCKETID 0
MICROCODE 1
CPUID Vendor Intel Family 6Model 63
[root@RedHat_test ~]# cat /var/log/messages
Feb 1311:59:01 RedHat_test systemd: [16423350.358386] Starting machine check poll CPU 1
Feb 1311:59:01 RedHat_test systemd: [16423350.371252] [Hardware Error]: Machine check events logged
同样的方式,在 el7 上设置
tail /var/log/messages 可以看到日志,但是 /var/log/mcelog 文件默认在 el7 上不存在!!原因是默认保存到 /var/log/messages。如果希望保存到 /var/log/mcelog,需要在 mcelog 的 service 文件中,加入参数 --logfile=/var/log/mcelog
,然后重启 mcelog
ExecStart=/usr/sbin/mcelog --ignorenodev--daemon--syslog--logfile=/var/log/mcelog
正文完
星哥玩云-微信公众号