ps 输出中的 Wchan 部分未显示任何内容

ps 输出中的 Wchan 部分未显示任何内容

我知道如果进程进入D状态,则意味着它处于不可中断状态。任何信号都无法终止该进程。只有在重新启动或 I/O 等待结束时,它才会退出该状态。

我有许多进程处于此D状态,这表明我的机器出了问题。而且即使重新启动后它们也会回到此D状态。我在网上搜索,发现wchanps 输出中的部分说明了我的进程正在等待内核中的什么东西。

当我使用此命令时,ps axl| grep D我进入了-wchan 列,并且网上没有解释这是什么意思。

这是上述命令的示例输出。

0     0  69970      1  20   0  25064  1088 -      D    ?          0:00 ls -l

我无法理解-上述输出的含义。

答案1

-导致wchan 被举报的可能原因有以下几种ps

  • 该进程没有被内核阻塞,即它正在运行(参见 psstate列)
  • 堆栈遍历过程由于某些极端情况或竞争条件而失败。它甚至可能无条件失败,例如在需要正确帧指针设置但在编译时没有设置它们的内核上 - 检查cat /proc/*/wchan- 所有 0 输出表示 wchan 支持中断(例如目前的情况Fedora 31 和 32
  • 没有必要ptrace 访问模式权限(即PTRACE_MODE_READ_FSCREDS)- 不太可能
  • 符号查找失败在内核中 - 不太可能

请注意,最新ps版本读取了 wchan 信息,/proc/$pid/wchan您也可以直接通过 访问cat,以便于测试。该文件读取0wchan 信息是否检索失败,ps-

在出现故障的系统上,wchan替代方案是查看(需要 root 权限):

cat /proc/$pid/stack

或者,请查阅(不需要 root 权限):

cat /proc/$pid/syscall

答案2

在较新的 Linux 内核中,您可以看到您的进程卡在哪个内核函数中

cat /proc/<pid_numer>/stack

答案3

ps 的手册页有此信息,“-”表示进程正在运行。进程在其中休眠的内核函数的 WCHAN 名称,如果进程正在运行,则为“-”,如果进程是多线程的并且 ps 未显示线程,则为“*”。

相关内容