我有一个在 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 来查看磁盘是否确实被淹没。