Linux服务器半夜突然失联,远程连不上,机房拍了张屏幕照片发过来,满屏kernel panic后面跟着一串寄存器信息。这相当于Linux的内核崩溃,类似Windows的蓝屏,但信息量更大,也更能说明问题。
内核为什么会panic
内核遇到自己无法安全继续运行的错误时,不会勉强跑下去,而是主动停下并打印现场。常见触发有:访问了非法内存地址、驱动在处理中断时报错、挂载根文件系统失败、内核模块版本不匹配。它宁可停机,也不让数据写坏。
从报错里抓关键信息
- 第一行:往往是Unable to handle kernel paging request,指内存访问越界。
- RIP寄存器:指向出错的函数名,能定位到具体模块。
- Call Trace:调用栈,从下往上看能找到调用源头。
- Kernel Offset:内核地址偏移,和具体版本相关。
最常见的几类原因
一是内存条故障,超频或接触不良,这种占很大比例,换插槽或跑memtest86能验证。二是驱动或内核模块的bug,特别是第三方网卡、阵列卡驱动,升级或回退版本试试。三是磁盘坏道导致根分区读不出。四是虚拟化环境资源超配,宿主机内存不足也可能诱发。
虚拟机里的panic反而好判断
同一台宿主机上多台虚拟机同时panic,基本能断定是宿主机的内存超分或存储IO异常,而不是每台虚机各自出问题。先看宿主机可用内存和存储时延,把超配降下来,比逐台排查虚机快得多。
复现和定位思路
先看消息日志里崩溃前的记录,把前一分钟的日志按时间戳对齐,往往能看出是先有硬件报错还是先有驱动异常。配合kdump生成vmcore,用crash工具分析栈回溯。没有kdump就先把它的服务开起来,下次再崩能拿到完整现场。生产机先重启恢复业务,再离线分析,别在带病的机器上反复折腾。