今天说下内核的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
Kthread_run创建一个名为khungtaskd的内核线程,处理函数是watchdog()
其中,和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状态的进程(线程)进行处理。
内核有进程处于D状态在120s内都没有被调度,则默认会触发panic,如果要关闭hung task panic,则可以设置内核参数kernel.hung_task_panic=0进行关闭。