日志 - 服务器内核:INFO:任务 httpd:000000 被阻止超过 120 秒

日志 - 服务器内核:INFO:任务 httpd:000000 被阻止超过 120 秒

我的服务器几乎每天都会因为负载过高而崩溃,即使重启 apache 或 mysql 也无法解决问题。我需要重启服务器才能解决,否则它会因为负载过高而再次崩溃。

当崩溃时日志系统会记录类似这样的内容:

Aug 11 18:33:53 server kernel: INFO: task httpd:20008 blocked for more than 120 seconds.
Aug 11 18:33:53 server kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Aug 11 18:33:53 server kernel: httpd         D ffffffff801538ac     0 20008   5816         20066 19809 (NOTLB)
Aug 11 18:33:53 server kernel:  ffff81025a299dc8 0000000000000082 ffff81033b4c0740 ffffffff80009a14
Aug 11 18:33:53 server kernel:  ffff8101063f8d80 0000000000000009 ffff8100b758f7e0 ffff8101c57187e0
Aug 11 18:33:53 server kernel:  00009436d4100b6c 000000000001d50f ffff8100b758f9c8 000000083b531588
Aug 11 18:33:53 server kernel: Call Trace:
Aug 11 18:33:53 server kernel:  [<ffffffff80009a14>] __link_path_walk+0x173/0xfb9
Aug 11 18:33:53 server kernel:  [<ffffffff8002cc16>] mntput_no_expire+0x19/0x89
Aug 11 18:33:53 server kernel:  [<ffffffff80063c4f>] __mutex_lock_slowpath+0x60/0x9b
Aug 11 18:33:53 server kernel:  [<ffffffff80023908>] __path_lookup_intent_open+0x56/0x97
Aug 11 18:33:53 server kernel:  [<ffffffff80063c99>] .text.lock.mutex+0xf/0x14
Aug 11 18:33:53 server kernel:  [<ffffffff8001b21f>] open_namei+0xea/0x712
Aug 11 18:33:54 server kernel:  [<ffffffff8002768a>] do_filp_open+0x1c/0x38
Aug 11 18:33:54 server kernel: Firewall: *UDP_IN Blocked* IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:30:48:9e:6e:99:08:00 SRC=208.43.135.158 DST=255.255.255.255 LEN=151 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=38354 DPT=6112 LEN=131 
Aug 11 18:33:54 server kernel:  [<ffffffff8001a061>] do_sys_open+0x44/0xbe
Aug 11 18:33:54 server kernel:  [<ffffffff8005d28d>] tracesys+0xd5/0xe0

我搜索了很多次试图找到解决方案。但看起来解决方案只是更新内核或磁盘驱动程序,我想我不知道该怎么做。

在此网址中http://bugs.centos.org/view.php?id=4515很多人报告了类似的问题,但事实上这些问题与我的 httpd 无关。

一位成员表示,一个解决方案是添加“电梯=noop”到 /etc/grub.conf 类似以下示例:

title CentOS (2.6.18-238.12.1.el5xen)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-238.12.1.el5xen ro root=/dev/VolGroup00/LogVol00 elevator=noop
        initrd /initrd-2.6.18-238.12.1.el5xen.img

这真的能解决问题吗?我的磁盘在 RAID 中工作。这会给我的服务器带来一些问题吗?

还有其他解决办法吗?

答案1

这是因为互斥锁。

仔细检查打印的堆栈跟踪。它是倒置的。你会发现这一行

mutex_lock_slowpath

似乎出现了资源紧缺的情况。

在大多数情况下,Sysstat 是一个很好的分析工具。如果您需要找到问题的根源,那么您将需要 vmcore 或内核内存转储。有两个 /proc 文件,分别称为

/proc/sys/kernel/hung_task_timeout_secs
/proc/sys/kernel/hung_task_panic

第一个文件的值为 120。这就是为什么您看到消息说任务被阻止了 120 秒。一个简单的测试是增加它并查看会发生什么。将其设置为 240 或 360。

默认情况下,下一个文件的值为 0。如果要收集 vmcore,则该值需要为 1。

显然,您需要设置 kdump 并修复转储目标。转储目标应大于物理内存大小。但即使您收集了 vmcore,您也需要一些 C、汇编和常规调试知识才能掌握它。专业支持或系统管理员可以提供更好的帮助。

但在我看来,更换电梯不会影响任何事情。

答案2

运行性能统计收集工具(我更喜欢sysstat,但你可能更喜欢其他东西)并分析它告诉你的瓶颈在哪里。

相关内容