Linux 内核崩溃分析。阻塞进程、IO 和不可中断等待

Linux 内核崩溃分析。阻塞进程、IO 和不可中断等待

我有一个在 CentOS 5.5 平台上运行的多用户 ERP 应用程序。硬件是 HP ProLiant DL380 G6。在过去的一年里,这是一个稳定的系统,但在过去一周出现了问题。问题是系统负载在几个小时内逐渐上升到 60+ 的水平。系统仍然响应迅速,但在某个时候,HP ASR 看门狗计时器启动并重新启动服务器。

我在现场有很多这样的系统,但以前从未遇到过这种问题。过去一周内崩溃了四次,但我今天早上在系统完全无响应之前就发现了问题。

这次,我发现系统负载约为 75,但有 14 个僵尸进程我无法终止。PPID 为 1,所以我知道需要重新启动。有趣的是,以下是 dmesg 输出的摘录,其中包含我在以前的崩溃中没有看到的消息。这些条目是什么意思?PID 对应于我无法终止的僵尸进程。是in.telnetd特定用户会话的 Telnet 守护程序,dbc是每个用户的 ERP 应用程序实例。

INFO: task in.telnetd:12210 blocked for more than 600 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
in.telnetd    D ffff81000102e4a0     0 12210   8899         16297 12762 (L-TLB)
 ffff8103848d7d38 0000000000000046 ffff8108272c1738 ffff81082328ae80
 ffff81082644d9c0 0000000000000009 ffff8102d8d7a080 ffff81011c9df100
 00011ef007c2d74b 0000000000002358 ffff8102d8d7a268 0000000500000001
Call Trace:
 [<ffffffff80063c6f>] __mutex_lock_slowpath+0x60/0x9b
 [<ffffffff8003db0d>] lock_timer_base+0x1b/0x3c
 [<ffffffff80063cb9>] .text.lock.mutex+0xf/0x14
 [<ffffffff8009dc66>] flush_workqueue+0x3f/0x87
 [<ffffffff801a96ee>] release_dev+0x503/0x67b
 [<ffffffff800646f9>] __down_failed+0x35/0x3a
 [<ffffffff80225b40>] sock_destroy_inode+0x0/0x10
 [<ffffffff800537af>] tty_release+0x11/0x1a
 [<ffffffff80012ad9>] __fput+0xd3/0x1bd
 [<ffffffff80023c39>] filp_close+0x5c/0x64
 [<ffffffff80038f19>] put_files_struct+0x63/0xae
 [<ffffffff80015860>] do_exit+0x31c/0x911
 [<ffffffff800491a7>] cpuset_exit+0x0/0x88
 [<ffffffff8005d116>] system_call+0x7e/0x83


INFO: task dbc:9054 blocked for more than 600 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
dbc           D ffff810001036b20     0  9054      1          3272  1795 (L-TLB)
 ffff81028e0c3d38 0000000000000046 0000000000000000 00000000000001d0
 0000000000000000 0000000000000009 ffff8107d60ff100 ffff81011c9ed080
 00011edea224420a 00000000000ebaee ffff8107d60ff2e8 0000000600000000
Call Trace:
 [<ffffffff80063c6f>] __mutex_lock_slowpath+0x60/0x9b
 [<ffffffff8003db0d>] lock_timer_base+0x1b/0x3c
 [<ffffffff80063cb9>] .text.lock.mutex+0xf/0x14
 [<ffffffff8009dc66>] flush_workqueue+0x3f/0x87
 [<ffffffff801a96ee>] release_dev+0x503/0x67b
 [<ffffffff8837dd1d>] :xfs:xfs_free_eofblocks+0x9d/0x1fe
 [<ffffffff800537af>] tty_release+0x11/0x1a
 [<ffffffff80012ad9>] __fput+0xd3/0x1bd
 [<ffffffff80023c39>] filp_close+0x5c/0x64
 [<ffffffff80038f19>] put_files_struct+0x63/0xae
 [<ffffffff80015860>] do_exit+0x31c/0x911
 [<ffffffff800491a7>] cpuset_exit+0x0/0x88
 [<ffffffff8006149d>] sysenter_do_call+0x1e/0x76

答案1

这些消息意味着某些东西正在消耗所有可用的 I/O。这要么是由于 (a) 硬件(磁盘/控制器/等)故障导致可用 I/O 为 0,要么是由于 (b) 有某个进程(或多个进程)正在使用所有 I/O。

有问题的进程可能不是 dmesg 中列出的进程。它是受害者。

因为我怀疑 in.telnetd(题外话:你为什么要运行 telnetd?)触及 /data 并且你的其他系统没有遇到此问题,所以我猜测 c0d0 坏了或者固件需要更新。

运行 HP Insight Diagnostics。否则下次发生这种情况时,看看是否可以运行 iostat 来查看磁盘是否确实被淹没。

相关内容