高负载会导致服务器挂起和错误“阻塞超过 120 秒”吗?

Tee*_*Tee 17 linux kernel

目前正在运行一些虚拟机和“裸机”服务器。Java 运行速度很高 - 有时超过 400%+。服务器随机挂起,控制台中出现错误“java - 阻塞超过 120 秒” - kjournald 等。

我无法获得 dmesg 输出,因为出于某种原因,此错误仅写入控制台,我无权访问,因为这是远程托管的。因此我无法复制完整的跟踪。

我改变了它所在的环境 - 即使是物理服务器,它仍在发生。

根据http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Technical_Notes/deployment.html,我将 Hung_task_timeout_secs 更改为 0 以防误报。

另外, irqbalance 没有安装,也许它会有所帮助?

这是 Ubuntu 10.04 64bit - 与最新的 2.6.38-15-server 和 2.6.36 相同的问题。

cpu 或内存问题/没有交换空间会导致此问题吗?

这是控制台消息:

[58Z?Z1.5?Z840] INFUI task java:21547 blocked for more than 120 seconds.
[58Z?Z1.5?Z986] "echo 0 > /proc/sgs/kernel/hung_task_timeout_secs" disables this
message.
[58Z841.5?Z06Z] INFUI task kjournald:190 blocked for more than 120 seconds.
[58Z841.5?Z336] "echo 0 > /proc/sgs/kernel/hung_task_timeout_secs" disables this
message.
[58Z841.5?Z600] INFUI task flush-202:0:709 blocked for more than 120 seconds.
[58Z841.5?Z90?] "echo 0 > /proc/sgs/kernel/hung_task_timeout_secs" disables this
message.
[58Z841.5?3413] INFUI task java:21547 blocked for more than 120 seconds.
[58Z841.5?368Z] "echo 0 > /proc/sgs/kernel/hung_task_timeout_secs" disables this
message.
[58Z961.5?ZZ36] INFUI task kjournald:60 blocked for more than 120 seconds.
[58Z961.5?Z6Z5] "echo 0 > /proc/sgs/kernel/hung_task_timeout_secs" disables this
message.
[58Z961.5?31ZZ] INFUI task flush-202:0:709 blocked for more than 120 seconds.
[58Z961.5?3393] "echo 0 > /proc/sgs/kernel/hung_task_timeout_secs" disables this
message.
Run Code Online (Sandbox Code Playgroud)

Pie*_*ier 16

是的,可以。

这意味着什么是相当明确的:内核无法在 120 秒内安排任务。这表明资源匮乏,通常围绕磁盘访问。

irqbalance可能会有所帮助,但这听起来并不明显。您能否在 中向我们提供此消息的周围信息dmesg,特别是跟随它的堆栈跟踪?

此外,这不是误报。这并不是说任务永远挂起,该声明是完全正确的。这并不意味着它对您来说是个问题,如果您没有注意到任何用户影响,您可以决定忽略它。

这不能由以下原因引起:

  • CPU 问题(或者更确切地说,这将是一个非常不可能的硬件故障),
  • 内存问题(很可能是硬件故障,但不会多次发生;而不是像进程那样缺少 RAM oom-killed),
  • 缺乏交换(oom-killer再次)。

从某种意义上说,您可能会将其归咎于内存不足,因为剥夺系统在 RAM 中缓存数据会导致更多 I/O。但这并不像“内存不足”那么简单。


小智 6

sudo sysctl -w vm.dirty_ratio=10
sudo sysctl -w vm.dirty_background_ratio=5
Run Code Online (Sandbox Code Playgroud)

然后提交更改:

sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)

帮我解决了....

  • 您应该解释每个设置的作用。 (9认同)
  • 这解决了我在 docker 环境中遇到的类似问题。我在这里找到了一个解释:http://www.blackmoreops.com/2014/09/22/linux-kernel-panic-issue-fix-hung_task_timeout_secs-blocked-120-seconds-problem/。“默认情况下,Linux 使用多达 40% 的可用内存用于文件系统缓存。达到此标记后,文件系统会将所有未完成的数据刷新到磁盘,导致所有后续 IO 同步。要将这些数据刷新到磁盘,有默认情况下,时间限制为 120 秒。在这种情况下,IO 子系统的速度不够快,无法用……刷新数据……” (7认同)