第二章:日志分析基础——系统日志、芯片内部寄存器日志、EDAC的解读方法

各位工程师朋友,大家好。今天我们聊聊日志分析。

说实话,芯片出故障时,第一手资料就是日志。我见过不少同事,一看到dmesg刷屏就慌了,其实大可不必。日志就像黑匣子,读懂了,问题就解决了一半。

2.1 系统日志(dmesg)——芯片的“体检报告”

dmesg是Linux内核输出的环形缓冲区日志。它记录了从开机到现在的所有内核级事件。我个人习惯,遇到服务器异常,第一件事就是跑dmesg | tail -200

核心命令:

# 查看所有日志
dmesg

# 实时监控(类似tail -f)
dmesg -w

# 按级别过滤(err、warn、info)
dmesg -l err

# 清空日志(慎用!)
dmesg -c

我重点关注什么?

  • 硬件错误(Hardware Error):比如PCIe链路降速、内存CE/UE错误。这些往往直接指向芯片问题。
  • 超时(Timeout):比如nvme0: I/O timeout,说明芯片响应慢了。
  • 中断风暴(IRQ storm):某个中断号疯狂触发,芯片可能卡死了。

小技巧:我习惯把dmesg输出重定向到文件,加上时间戳:dmesg -T > /var/log/dmesg_$(date +%Y%m%d).log。这样方便回溯。

2.2 芯片内部寄存器日志——直接“问”芯片

系统日志是间接信息。想拿到第一手数据,得读芯片寄存器。

不同芯片厂商的工具不同。Intel用rdmsr,AMD用hwmon,ARM平台用devmem2。但思路一样:通过PCIe配置空间或MMIO地址,直接读取芯片内部状态。

举个例子:

# 读取PCIe设备的配置空间(Bus:Device.Function)
setpci -s 03:00.0 CAP_EXP+0x0C.w

# 读取MSR寄存器(Model-Specific Register)
rdmsr -p 0 0x1A2

我在项目中遇到过一台机器,dmesg里没有任何错误,但性能奇差。我读了芯片的PCIe Link Status寄存器,发现链路协商在Gen3,但实际跑在Gen1。这就是典型的“寄存器说谎”案例——芯片没报错,但状态不对。

注意:读寄存器前,一定要确认芯片的Datasheet。不同厂商的寄存器地址定义完全不同。我曾经因为读错地址,浪费了整整两天。

2.3 EDAC错误日志——内存错误的“显微镜”

EDAC(Error Detection And Correction)是Linux内核的内存错误检测框架。它专门处理ECC内存的纠错和报错。

说白了,内存颗粒出问题了,EDAC会告诉你:哪个DIMM、哪个Bank、哪个Row出错了。

查看EDAC日志:

# 查看EDAC驱动状态
ls /sys/devices/system/edac/mc/

# 查看内存控制器0的信息
cat /sys/devices/system/edac/mc/mc0/ce_count
cat /sys/devices/system/edac/mc/mc0/ue_count

# 查看具体DIMM的错误计数
cat /sys/devices/system/edac/mc/mc0/dimm0/ce_count

CE vs UE:

类型 含义 处理方式
CE(Correctable Error) 可纠正错误,ECC纠回来了 记录日志,继续运行。但频繁出现说明内存颗粒快挂了
UE(Uncorrectable Error) 不可纠正错误,数据已损坏 立即触发MCE(Machine Check Exception),系统可能panic

我的经验:CE计数持续增长,但没触发UE,很多人觉得没事。其实这是预警信号。我建议CE计数超过100次/天,就安排更换内存条。别等到UE出现,那时候数据已经丢了。

2.4 实战:三份日志联合诊断

单独看一份日志,容易误判。我习惯把dmesg、寄存器、EDAC三份数据放在一起分析。

举个真实案例:

  1. dmesg显示EDAC MC0: 1 CE error on DIMM_A1
  2. 寄存器读取rdmsr -p 0 0x17C 返回非零值,说明MCE状态寄存器有记录
  3. EDAC确认cat /sys/devices/system/edac/mc/mc0/dimm0/ce_count 显示计数为47

三份日志都指向同一个DIMM。这时候我直接定位到物理插槽A1,更换内存条。问题解决。

避坑指南:我曾经遇到过EDAC报错,但dmesg里没有对应记录。后来发现是内核编译时没开CONFIG_EDAC_DEBUG。所以,检查内核配置也是排查的一部分。

2.5 总结要点

  • dmesg:看硬件错误、超时、中断异常。适合快速定位。
  • 寄存器日志:直接读芯片内部状态。适合深挖问题根因。
  • EDAC:专门针对内存错误。CE是预警,UE是警报。

嗯,日志分析这块,说白了就是“多问、多看、多对比”。别怕日志多,怕的是不看日志就瞎猜。下次遇到芯片故障,先跑这三条命令,能省你不少时间。

好,这一章就到这里。下一章我们聊聊PCIe链路故障的调试方法,那个更刺激。