事情本身不复杂,线索都在日志里。一台自建机房的 CentOS 7.9 在凌晨失去响应,KVM 上看到内核 Oops 之后停在原地,kernel.panic 的值是 0,机器一直挂到第二天人工重启。

第一反应是「带外管理没有配置自动复位策略」,验证下来不成立。

排查方向其实有限,先把可能性排一排。kernel.panic 为 0 表示崩溃后不自动重启,内核停在 panic 现场。另一种情况是panic_on_oops 没开,部分错误只记录不触发重启。

还有一种情况,kdump 保留了现场,但没人去看 vmcore。

动手时先看当前的崩溃策略

sysctl kernel.panic kernel.panic_on_oops

接着设置十秒后自动重启

sysctl -w kernel.panic=10 && sysctl -w kernel.panic_on_oops=1

再往下写进持久化配置

printf 'kernel.panic = 10\nkernel.panic_on_oops = 1\n' > /etc/sysctl.d/99-panic.conf

末了确认 kdump 能留下现场

systemctl is-active kdump && ls -lh /var/crash | tail -3

怎么算真的好了,看的是同一批现象。人为触发一次软锁死后机器在十秒内自动重启,业务恢复,/var/crash 下留有对应的 vmcore 目录可供分析。

容易忽略的是,自动重启只是保住可用性,根因还得靠 vmcore 分析;panic 时间别设太短,给 kdump 留出写盘的时间。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189