“信息:任务 XXX 阻塞超过 120 秒”在 Linux 上究竟是什么意思?

Tot*_*tor 16 scheduling linux-kernel

我在内核日志有这样的消息:INFO: task XXX blocked for more than 120 seconds。我想知道这在技术上意味着什么:内核在什么条件下显示有关任务的消息?

作为记录,我被阻止的任务是multipathd,但我也对这个错误的一般含义感兴趣。

Nil*_*ils 14

如果任务被阻塞,它会等待资源再次可用。

在您的情况下,可能存在 IO 问题或磁盘区域争用。或者您的系统负载如此之高,以至于没有足够的 CPU 功率来及时完成工作。

如果 cron 尝试在非常繁忙的时间开始工作,我已经从 cron 中看到了这个错误。


rak*_*ice 8

基本上,如果 CPU 调度程序在给定的时间内没有切换到进程,并且该进程不符合异常条件,则会触发此日志记录。

例外情况是进程尚未切换到但不应被记录的特殊情况。我不清楚异常的条件;FWIW对代码中案例的评论是:

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.
Run Code Online (Sandbox Code Playgroud)

(来自check_hung_task()Linux hung_task.chttps://elixir.bootlin.com/linux/v5.12.12/source/kernel/hung_task.c#L92

至于为什么一个任务可能不会被安排很长时间,它一直处于 TASK_UNINTERRUPTABLE (' D' state in top),例如当阻塞等待 I/O 完成时,将是一种可能性,但我不知道其他人可能有什么。