“任务 mysqld:xxx 阻塞超过 120 秒”是什么意思?

“任务 mysqld:xxx 阻塞超过 120 秒”是什么意思?

我们正在对 MySQL 问题进行故障排除,其中某些查询需要很长时间才能完成,我在 /var/log/messages 中看到其中许多条目:

Jan 28 05:52:15 64455-alpha01 kernel: [2529273.616327] INFO: task mysqld:4123 blocked for more than 120 seconds.
Jan 28 05:52:15 64455-alpha01 kernel: [2529273.616525] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Jan 28 05:52:15 64455-alpha01 kernel: [2529273.616813] mysqld        D  000000000000000d     0  4123   3142 0x00000080

这是什么意思?它如何影响 MySQL 线程(4123 是线程 ID?)

我现在检查时的值为/proc/sys/kernel/hung_task_timeout_secs

$ cat /proc/sys/kernel/hung_task_timeout_secs
120

我特别想知道它如何影响这个过程?

我在论坛上读到,这意味着当该进程占用过多内存时就会发生这种情况。

答案1

“挂起任务”是导致内核使任务陷入不可中断“D”状态的错误。处于该状态的任务/进程不能被终止,也不能被终止kill -9

您的消息/var/log/messages意味着该任务4123(显然 mysql 守护进程)自 120 秒以来就处于该状态。这意味着 mysql 守护进程等待资源。大多数“D”状态是由 I/O 引起的。

当进程请求对打开的文件句柄进行读取系统调用时,只要需要读取文件,它就会进入状态“D”。该过程被“阻止”。

该值/proc/sys/kernel/hung_task_timeout_secs仅定义您看到的消息何时应出现在日志中。正如您的消息所述,当您将值设置为 时,您可以禁用该消息0。但是,这并不能解决你的问题。

您只能通过两种方式解决不可中断状态:

  1. 重新启动系统,或者...
  2. 找出流程需要哪些资源,并确保资源可用。

答案2

echo 0 > /proc/sys/kernel/hung_task_timeout_secs只会使警告静音。除此之外,它没有任何影响。任何大于零的值都会导致每当任务被阻止一段时间时发出此消息。

发出警告表明系统存在问题。根据我的经验,这意味着该进程在内核空间中被阻塞至少 120 秒,通常是因为该进程缺乏磁盘 I/O。这可能是由于使用了太多内存而导致的大量交换,例如,如果您的 Web 服务器负载很重并且您为系统配置了太多的 apache 子进程。在你的情况下,可能只是有太多 mysql 进程竞争内存和数据 IO。

如果底层存储系统性能不佳,例如,如果您的 SAN 过载,或者磁盘上存在导致大量重试的软错误,也可能会发生这种情况。每当任务必须等待很长时间才能完成其 IO 命令时,可能会发出这些警告。

相关内容