确定 Linux 内核恐慌的原因

确定 Linux 内核恐慌的原因

我正在运行 Ubuntu 12.04 衍生版 (amd64),最近我遇到了非常奇怪的问题。出乎意料的是,X 似乎会完全冻结一段时间(1-3 分钟?),然后系统将重新启动。该系统已超频,但经 Windows 验证非常稳定,这让我相信我遇到了内核恐慌或我的模块之一出现问题。即使在 Linux 中,我也可以运行 LINPACK,并且不会出现崩溃,尽管 CPU 负载过高。崩溃似乎是随机发生的,即使机器闲置时也是如此。

如何调试导致系统崩溃的原因?

预感这可能是专有的 NVIDIA 驱动程序,我一路恢复到该驱动程序的稳定版本(版本 304),但仍然遇到崩溃。

谁能引导我完成崩溃后的良好调试程序?我非常乐意启动拇指驱动器并发布所有崩溃后的配置文件,我只是不确定它们是什么。我如何找出导致我的系统崩溃的原因?

这是一堆日志,通常是罪魁祸首。

.xsession-错误:http://pastebin.com/EEDtVkVm

/var/log/Xorg.0.log:http://pastebin.com/ftsG5VAn

/var/log/kern.log:http://pastebin.com/Hsy7jcHZ

/var/log/系统日志:http://pastebin.com/9Fkp3FMz

我什至根本找不到事故记录。

触发崩溃并不那么简单,它似乎是在 GPU 尝试同时绘制多个东西时发生的。如果我全屏播放 YouTube 视频并让它重复一段时间或滚动浏览大量 GIF 并弹出 Skype 通知,有时它会崩溃。我对这个完全摸不着头脑。

CPU 超频至 4.8GHz,但它完全稳定,并且在昨天的 LINPACK 运行和 9 小时的 Prime95 测试中没有出现任何崩溃。

更新

我已经安装了kdumpcrash、 和linux-crashdump,以及我的内核版本 3.2.0-35 的内核调试符号。当我apport-unpack在崩溃的内核文件上运行,然后在故障转储crash上运行时VmCore,我看到的是:

      KERNEL: /usr/lib/debug/boot/vmlinux-3.2.0-35-generic
    DUMPFILE: Downloads/crash/VmCore
        CPUS: 8
        DATE: Thu Jan 10 16:05:55 2013
      UPTIME: 00:26:04
LOAD AVERAGE: 2.20, 0.84, 0.49
       TASKS: 614
    NODENAME: mightymoose
     RELEASE: 3.2.0-35-generic
     VERSION: #55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012
     MACHINE: x86_64  (3499 Mhz)
      MEMORY: 8 GB
       PANIC: "[ 1561.519960] Kernel panic - not syncing: Fatal Machine check"
         PID: 0
     COMMAND: "swapper/5"
        TASK: ffff880211251700  (1 of 8)  [THREAD_INFO: ffff880211260000]
         CPU: 5
       STATE: TASK_RUNNING (PANIC)

log当我从该实用程序运行时crash,我在日志底部看到以下内容:

[ 1561.519943] [Hardware Error]: CPU 4: Machine Check Exception: 5 Bank 3: be00000000800400
[ 1561.519946] [Hardware Error]: RIP !INEXACT! 33:<00007fe99ae93e54> 
[ 1561.519948] [Hardware Error]: TSC 539b174dead ADDR 3fe98d264ebd MISC 1 
[ 1561.519950] [Hardware Error]: PROCESSOR 0:206a7 TIME 1357862746 SOCKET 0 APIC 1 microcode 28
[ 1561.519951] [Hardware Error]: Run the above through 'mcelog --ascii'
[ 1561.519953] [Hardware Error]: CPU 0: Machine Check Exception: 4 Bank 3: be00000000800400
[ 1561.519955] [Hardware Error]: TSC 539b174de9d ADDR 3fe98d264ebd MISC 1 
[ 1561.519957] [Hardware Error]: PROCESSOR 0:206a7 TIME 1357862746 SOCKET 0 APIC 0 microcode 28
[ 1561.519958] [Hardware Error]: Run the above through 'mcelog --ascii'
[ 1561.519959] [Hardware Error]: Machine check: Processor context corrupt
[ 1561.519960] Kernel panic - not syncing: Fatal Machine check
[ 1561.519962] Pid: 0, comm: swapper/5 Tainted: P   M     C O 3.2.0-35-generic #55-Ubuntu
[ 1561.519963] Call Trace:
[ 1561.519964]  <#MC>  [<ffffffff81644340>] panic+0x91/0x1a4
[ 1561.519971]  [<ffffffff8102abeb>] mce_panic.part.14+0x18b/0x1c0
[ 1561.519973]  [<ffffffff8102ac80>] mce_panic+0x60/0xb0
[ 1561.519975]  [<ffffffff8102aec4>] mce_reign+0x1f4/0x200
[ 1561.519977]  [<ffffffff8102b175>] mce_end+0xf5/0x100
[ 1561.519979]  [<ffffffff8102b92c>] do_machine_check+0x3fc/0x600
[ 1561.519982]  [<ffffffff8136d48f>] ? intel_idle+0xbf/0x150
[ 1561.519984]  [<ffffffff8165d78c>] machine_check+0x1c/0x30
[ 1561.519986]  [<ffffffff8136d48f>] ? intel_idle+0xbf/0x150
[ 1561.519987]  <<EOE>>  [<ffffffff81509697>] ? menu_select+0xe7/0x2c0
[ 1561.519991]  [<ffffffff815082d1>] cpuidle_idle_call+0xc1/0x280
[ 1561.519994]  [<ffffffff8101322a>] cpu_idle+0xca/0x120
[ 1561.519996]  [<ffffffff8163aa9a>] start_secondary+0xd9/0xdb

bt输出回溯:

PID: 0      TASK: ffff880211251700  CPU: 5   COMMAND: "swapper/5"
 #0 [ffff88021ed4aba0] machine_kexec at ffffffff8103947a
 #1 [ffff88021ed4ac10] crash_kexec at ffffffff810b52c8
 #2 [ffff88021ed4ace0] panic at ffffffff81644347
 #3 [ffff88021ed4ad60] mce_panic.part.14 at ffffffff8102abeb
 #4 [ffff88021ed4adb0] mce_panic at ffffffff8102ac80
 #5 [ffff88021ed4ade0] mce_reign at ffffffff8102aec4
 #6 [ffff88021ed4ae40] mce_end at ffffffff8102b175
 #7 [ffff88021ed4ae70] do_machine_check at ffffffff8102b92c
 #8 [ffff88021ed4af50] machine_check at ffffffff8165d78c
    [exception RIP: intel_idle+191]
    RIP: ffffffff8136d48f  RSP: ffff880211261e38  RFLAGS: 00000046
    RAX: 0000000000000020  RBX: 0000000000000008  RCX: 0000000000000001
    RDX: 0000000000000000  RSI: ffff880211261fd8  RDI: ffffffff81c12f00
    RBP: ffff880211261e98   R8: 00000000fffffffc   R9: 0000000000000f9f
    R10: 0000000000001e95  R11: 0000000000000000  R12: 0000000000000003
    R13: ffff88021ed5ac70  R14: 0000000000000020  R15: 12d818fb42cfe42b
    ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018
--- <MCE exception stack> ---
 #9 [ffff880211261e38] intel_idle at ffffffff8136d48f
#10 [ffff880211261ea0] cpuidle_idle_call at ffffffff815082d1
#11 [ffff880211261f00] cpu_idle at ffffffff8101322a

有任何想法吗?

答案1

我有两个建议可以开始。

第一个你不会喜欢的。无论你认为你的超频系统有多稳定,它都是我的第一个怀疑对象。您向其报告问题的任何开发人员都会说同样的话。您的稳定测试工作负载不一定使用相同的指令,从而对内存子系统造成同样大的压力,无论如何。停止超频。如果你想让人们相信问题不是超频造成的,那就在不超频的时候让它发生,这样你就可以获得一份干净的错误报告。这将对其他人为解决这个问题投入多少努力产生巨大的影响。拥有无错误的软件是值得骄傲的一点,但是来自硬件设置特别有问题的人的报告会令人沮丧,浪费时间,而且可能根本不涉及真正的错误。

第二个是获取 oops 数据,正如您所注意到的,它不会到达您提到的任何地方。如果崩溃仅在运行 X11 时发生,我认为本地控制台几乎无法使用(无论如何这都很痛苦),因此您需要通过串行控制台、网络或保存到本地磁盘来执行此操作(这比较棘手)比听起来更好,因为您不希望不可信的内核损坏您的文件系统)。以下是一些方法:

  • 使用网络转储通过网络保存到服务器。我已经很多年没有这样做了,所以我不确定这个软件是否仍然存在并且可以与现代内核一起使用,但它很简单,值得一试。
  • 使用串行控制台启动(存档版本,当前版本);您需要两台机器上都有一个可用的串行端口(无论是老式机器还是 USB 串行适配器)和一根零调制解调器电缆;您可以配置另一台机器来保存输出。
  • 转储文件似乎是现在很酷的孩子使用的,并且看起来相当灵活,尽管这不是我的偏好,因为它看起来设置起来很复杂。简而言之,它涉及启动一个可以执行任何操作并检查前一个内核的内存内容的不同内核,但您必须基本上构建整个过程,而且我没有看到很多固定选项。  更新:实际上,有一些不错的发行版东西;在 Ubuntu 上,linux-crashdump (存档版本,当前版本)。

一旦获得调试信息,就会有一个名为 ksymoops 的工具(存档版本,当前版本(有广告)),您可以使用它将地址转换为符号名称,并开始了解内核是如何崩溃的。如果符号化转储对您没有任何意义,至少在此处报告或在您的 Linux 发行版的邮件列表/错误跟踪器上报告是有帮助的。


crash崩溃转储中,您可以尝试输入logbt获取更多信息(在恐慌期间记录的内容和堆栈回溯)。你的Fatal Machine check似乎来自这里, 尽管。通过浏览代码,您的处理器报告了机器检查异常– 硬件问题。同样,我的第一个赌注是由于超频。输出中似乎可能有更具体的消息log可以告诉您更多信息。

另外从该代码来看,如果您使用mce=3内核参数启动,它将停止崩溃......但我不会真正推荐这样做,除非作为诊断步骤。如果 Linux 内核认为这个错误值得崩溃,那么它可能是对的。

答案2

a) 检查 rsyslog 守护进程是否将内核消息记录到文件中

vi /etc/rsyslog.conf

并添加以下内容

kern.*                 /var/log/kernel.log

重新启动rsyslog服务。

/etc/initd.d/rsyslog restart

b) 记下加载的模块

`lsmod >/your/home/dir`

c) 由于恐慌无法重现,请等待它发生

d) 一旦发生紧急情况,使用 Live 或紧急 CD 启动系统

e) 挂载受影响系统的文件系统(如果 /var 和 /home 不是单独的文件系统,通常 / 就足够了)(如果您在受影响的系统上使用 LVM 来启动 LV,则需要运行 pvs命令vgslvsmount -t ext4 /dev/sdXN /mnt

f) 转到/mnt/var/log/目录并检查kernel.log文件。这应该为您提供足够的信息来确定特定模块或其他模块是否发生了紧急情况。

答案3

你的处理器超频了吗?今天,当我在 BIOS 的超频菜单中使用倍频器时,我遇到了同样的问题; 20 倍左右的各种乘数都会导致这种情况发生。我将其降低至 18.5x (3.7GHz),问题就消失了;我认为这是主板/电源问题。

答案4

我们在旧设备上安装了 mikrotik 路由器。风扇停止旋转并导致处理器变热。然后路由器时不时地开始出现内核恐慌。更换CPU风扇后,一切顺利。

由于您正在超频您的机器,这可能是一个可能的原因。

相关内容