记录一下那天晚上的排查过程。一台 CentOS 7 按安全加固清单加了 kernel.panic_on_oops=1,某天业务高峰期机器无故重启,vmcore 里能看到一次驱动的 WARNING 调用栈。

刚开始盯着「panic 之后配置了自动重启,机器起来看起来像无故重启」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。panic_on_oops 让内核在遇到 oops 时直接 panic,而 WARNING 也会走到这条路径。还有一种是某块网卡驱动在高负载下触发了空指针告警,本来只是丢一个包。

另外,kdump 没配好,连崩溃现场都没有留下。

先确认上次重启的原因

last -x reboot && journalctl -k -b -1 | tail -50

然后查看内核参数与 kdump 状态

sysctl kernel.panic_on_oops kernel.panic && systemctl status kdump

接着按业务容忍度决定是否保留该参数

sysctl -w kernel.panic_on_oops=0

剩下的就是把决定写进配置并验证 kdump 可用

echo 'kernel.panic_on_oops = 0' > /etc/sysctl.d/90-panic.conf && sysctl --system

怎么算真的好了,看的是同一批现象。vmcore-dmesg 里能看到完整调用栈并定位到具体驱动,机器不再因 WARNING 自动重启,业务连续运行超过一周没有意外重启记录。

这里还有个坑。这个参数适合必须保留现场的分析环境,生产上开了就等于把告警升级成宕机;关掉之前要确保日志和监控能捕获 oops。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189