linux内核hung task机制

linux内核hung task机制

Posted by lwk on February 21, 2020

今天说下内核的hung task机制。

有时在/var/log/messages会看到这样的提示:

kernel: INFO: task xxx blocked for morethan 120 seconds

kernel: “echo 0 >/proc/sys/kernel/hung_task_timeout_secs” disables this message.

kernel: xxx D ffff944c19515140 0 22008 1 0x00000080

hung task源码在kernel/hung_task.c文件中,系统启动时会执行hung_task_init

image

Kthread_run创建一个名为khungtaskd的内核线程,处理函数是watchdog()

image

其中,和hung task相关的内核参数可以通过sysctl –a grep hung查看

kernel.hung_task_check_count = 4194304

kernel.hung_task_panic = 1

kernel.hung_task_timeout_secs = 120

kernel.hung_task_warnings = 10

watchdog函数调用check_hung_uninterruptible_tasks,遍历所有进程和线程,对处于D状态的进程(线程)进行处理。

image

image

image

内核有进程处于D状态在120s内都没有被调度,则默认会触发panic,如果要关闭hung task panic,则可以设置内核参数kernel.hung_task_panic=0进行关闭。