我知道如果进程进入D
状态,则意味着它处于不可中断状态。任何信号都无法终止该进程。只有在重新启动或 I/O 等待结束时,它才会退出该状态。
我有许多进程处于此D
状态,这表明我的机器出了问题。而且即使重新启动后它们也会回到此D
状态。我在网上搜索,发现wchan
ps 输出中的部分说明了我的进程正在等待内核中的什么东西。
当我使用此命令时,ps axl| grep D
我进入了-
wchan 列,并且网上没有解释这是什么意思。
这是上述命令的示例输出。
0 0 69970 1 20 0 25064 1088 - D ? 0:00 ls -l
我无法理解-
上述输出的含义。
答案1
-
导致wchan 被举报的可能原因有以下几种ps
:
- 该进程没有被内核阻塞,即它正在运行(参见 ps
state
列) - 这堆栈遍历过程由于某些极端情况或竞争条件而失败。它甚至可能无条件失败,例如在需要正确帧指针设置但在编译时没有设置它们的内核上 - 检查
cat /proc/*/wchan
- 所有 0 输出表示 wchan 支持中断(例如目前的情况Fedora 31 和 32) - 你没有必要ptrace 访问模式权限(即
PTRACE_MODE_READ_FSCREDS
)- 不太可能 - 这符号查找失败在内核中 - 不太可能
请注意,最新ps
版本读取了 wchan 信息,/proc/$pid/wchan
您也可以直接通过 访问cat
,以便于测试。该文件读取0
wchan 信息是否检索失败,ps
即-
。
在出现故障的系统上,wchan
替代方案是查看(需要 root 权限):
cat /proc/$pid/stack
或者,请查阅(不需要 root 权限):
cat /proc/$pid/syscall
答案2
在较新的 Linux 内核中,您可以看到您的进程卡在哪个内核函数中
cat /proc/<pid_numer>/stack
答案3
ps 的手册页有此信息,“-”表示进程正在运行。进程在其中休眠的内核函数的 WCHAN 名称,如果进程正在运行,则为“-”,如果进程是多线程的并且 ps 未显示线程,则为“*”。