我们正在对 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
。但是,这并不能解决你的问题。
您只能通过两种方式解决不可中断状态:
- 重新启动系统,或者...
- 找出流程需要哪些资源,并确保资源可用。
答案2
echo 0 > /proc/sys/kernel/hung_task_timeout_secs
只会使警告静音。除此之外,它没有任何影响。任何大于零的值都会导致每当任务被阻止一段时间时发出此消息。
发出警告表明系统存在问题。根据我的经验,这意味着该进程在内核空间中被阻塞至少 120 秒,通常是因为该进程缺乏磁盘 I/O。这可能是由于使用了太多内存而导致的大量交换,例如,如果您的 Web 服务器负载很重并且您为系统配置了太多的 apache 子进程。在你的情况下,可能只是有太多 mysql 进程竞争内存和数据 IO。
如果底层存储系统性能不佳,例如,如果您的 SAN 过载,或者磁盘上存在导致大量重试的软错误,也可能会发生这种情况。每当任务必须等待很长时间才能完成其 IO 命令时,可能会发出这些警告。