我在一台机器上运行 Ubuntu Server 14.04,这台机器在负载下会随机崩溃。服务器不会独立重启,但无法通过 ssh 或直接 KVM 连接访问。
我怀疑是 CPU 问题,但我正在寻找确凿的证据,因此我按照此处的说明进行操作:
https://wiki.ubuntu.com/Kernel/CrashdumpRecipe
/var/crash
然而,无论是自然崩溃还是诱发崩溃后,都不会出现日志文件。
细节:
(我在每个这里描述的改变之间都引发了一次崩溃,但没有任何改变。)
一切都很顺利,直到我到了这一步:
$ cat /sys/kernel/kexec_crash_loaded
0
预期输出为 1。经过一番挖掘,我发现了/etc/default/kdump-tools
,我在其中设置了USE_KDUMP=1
。当这不起作用时,我KDUMP_SYSCTL="kernel.panic=60 kernel.panic_on_oops=1"
根据sysctl 文档。还是没有效果,所以我直接用修改了参数,sysctl -w kernel.panic=60
据说可以为 kdump 增加额外的时间来执行其工作。
在每种情况下,我都会运行:
echo c | sudo tee /proc/sysrq-trigger
计算机将按预期崩溃并重新启动,但我所看到的只有以下内容:
$ ls /var/crash
kexec_cmd
/var/log/kern.log
仅包含启动时的日志条目,而不包含崩溃时的日志条目。(不确定这是否是预期的,但我还是想提一下。)
我的配置有问题吗?
答案1
如果/boot
位于单独的分区上,Ubuntu 上的内核崩溃转储将由于 ---> 而失败漏洞它在 14.04 Trusty 中仍然存在,你能相信吗?至少对于使用 LVM 和单独的/boot
.
解决方法是
unmount /boot
然后将其安装到其他安装点,例如/mnt
- 将内容复制到
/boot
(与 位于同一块设备上的那个/
)。例如rsync -axHAX --progress --stats /mnt/ /boot
- 使用以下方式触发崩溃
echo c | sudo tee /proc/sysrq-trigger
- 如果一切顺利,您将看到以
/var/crash
(uname -r)-yyyymmddHHmm.crash 形式出现的内核崩溃转储以及带有 dmesg 和 dump 的 yyyymmddHHmm 目录。
如果您想分析崩溃转储,您将需要crash
,请按如下所示运行它:
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/yyyymmddHHmm/dump.yyyymmddHHmm
有关崩溃的更多信息,请阅读手册。
/etc/default/kdump-tools
顺便说一句:更改后不要忘记重新加载 kdump-tools 配置kdump-config load
。
答案2
可能是预留内存太小了(我的问题就是这个原因导致的)。
我认为你应该从三个步骤检查正确的事情。首先,按照[Ubuntu 内核崩溃转储]检查你的配置:https://help.ubuntu.com/lts/serverguide/kernel-crash-dump.html
第二dmesg|grep -i crash
,检查预留内存是否正常。
第三,service kdump-tools status
检查加载kdump内核是否正常。
第三步,日志很重要,查看/var/log/syslog
日志,然后找出原因。