我的内核日志中有这条消息INFO: task XXX blocked for more than 120 seconds
:我想知道这在技术上意味着什么:在什么条件下内核会显示有关任务的消息?
根据记录,我被阻止的任务是multipathd
,但我也对这个错误的一般含义感兴趣。
答案1
如果任务被阻塞,它会等待资源再次可用。
在您的情况下,可能存在 IO 问题或磁盘区域争用。或者您的系统负载太高,以至于没有足够的 CPU 能力来及时完成作业。
我在 cron 中看到了这个错误,如果它试图在非常繁忙的时间启动一项作业。
答案2
基本上,如果 CPU 调度程序在给定时间内没有切换到该进程,并且该进程不符合异常条件,则会触发此日志记录。
异常是特殊情况,即尚未切换到某个进程,但不应记录该进程。我不清楚异常的条件;代码中对这些情况的注释如下:
Also, skip vfork and any other user process that freezer should skip.
Also, when a freshly created task is scheduled once, changes
its state to TASK_UNINTERRUPTIBLE without having ever been
switched out once, it musn't be checked.
(来自check_hung_task()
Linux hung_task.c
)
https://elixir.bootlin.com/linux/v5.12.12/source/kernel/hung_task.c#L92
至于为什么一个任务可能不会在很长一段时间内被调度,它连续处于 TASK_UNINTERRUPTABLE (' D
' 状态top
),例如当阻塞等待 I/O 完成时,将是一种可能,但我不认为知道其他人可能还有什么。