ps 命令输出不显示 Fedora 中的 wchan 值

ps 命令输出不显示 Fedora 中的 wchan 值

我在跑步Fedora 5.3.12-200.fc30.x86_64并测试简单的 tcp 客户端/服务器代码。我尝试运行不同的ps 命令但我无法显示任何值沃昌字段,尽管在我的情况下服务器和客户端都处于暂停状态。


編輯

经过进一步测试,它似乎取决于发行版。Kali 和 devuan 计算 wchan 值,而 fedora 和 OpenSUSE Tumbleweed 不计算。有人知道为什么会这样吗?我在内核中发现的唯一条目与 wchan 值相对应

(CONFIG_SCHED_OMIT_FRAME_POINTER=y)

在 kali、tumbleweed 和 fedora 中的配置方式相同。我在 devuan 中找不到该参数。


以下是 Fedora 上 ps 命令的输出。无论我做什么,wchan 都只显示该进程正在运行。我尝试运行不同的 ps 命令来显示所有进程,但 wchan 值只显示连字符。

$ ps -o pid,ppid,wchan=WIDE-WCHAN-COLUMN -o comm -o stat -t pts/6 -t pts/7
   PID   PPID WIDE-WCHAN-COLUMN COMMAND         STAT
 58565   4247 -                 bash            Ss
102840  58565 -                 su              S
102848 102840 -                 bash            S
103048   4247 -                 bash            Ss
122844 102848 -                 tcpserv01       S+
122848 103048 -                 tcpcli01        S+
122849 122844 -                 tcpserv01       S+

我检查了 /proc 中的 wchan,得到的只有 0。

$ cat /proc/122844/wchan
0

服务器的 strace 没有传递 accept(),这正是我所期望的。

# strace -p 122844
strace: Process 122844 attached
accept(3, 

正如预期的那样,客户端的 strace 在 read() 处被阻止。

# strace -p 122848
strace: Process 122848 attached
read(0, 

但它们没有出现在 wchan 中。我错过了什么?



顺便提一下,我在同一台机器上也有 FreeBSD (VM),在 FreeBSD 12.0-RELEASE 中 wchan 显示正确当使用 ps 命令时,所以我很确定这与 fedora 有关。

$ ps aux -o pid,wchan=WIDE-WCHAN-COLUMN -o comm -o stat
USER  PID  %CPU %MEM   VSZ   RSS TT  STAT STARTED      TIME COMMAND          PID WIDE-WCHAN-COLUMN COMMAND          STAT
root   11 599.0  0.0     0    96  -  RNL  13:01   360:26.86 [idle]            11 -                 idle             RNL
root    0   0.0  0.0     0   528  -  DLs  13:01     0:00.01 [kernel]           0 swapin            kernel           DLs
root    1   0.0  0.0  9952  1016  -  ILs  13:01     0:00.01 /sbin/init --      1 wait              init             ILs
root    2   0.0  0.0     0    16  -  DL   13:01     0:00.00 [crypto]           2 crypto_w          crypto           DL


编辑我在 man ps 中发现以下内容

-n 设置名称列表文件。与 N 相同。名称列表文件是正确显示 WCHAN 所必需的,并且必须与当前 Linux 内核完全匹配才能正确输出。如果没有此选项,则名称列表的默认搜索路径为:$PS_SYSMAP...

所以我设定了

PS_SYSMAP=/boot/System.map-$(uname -r)

但我仍然没有从 wchan 获得任何输出。如果我尝试运行与之前相同的命令但使用 -n,我会得到

$ ps -n -o pid,ppid,wchan=WIDE-WCHAN-COLUMN -o comm -o stat -t pts/2 -t pts/3 -t pts/4
   PID   PPID WIDE-WCHAN-COLUMN COMMAND         STAT
  4830   4829                 - bash            Ss
  6201   4829                 - bash            Ss
  6251   6201                 - tcpserv01       S+
  6252   4829                 - bash            Ss
  6292   6251                 - tcpse <defunct> Z+
  6356   6252                 - tcpcli01        S+
  6357   6251                 - tcpserv01       S+
  6481   4830                 - ps              R+

使用 -n 选项后,wchan 甚至不会像以前一样显示连字符。




编辑2 以下问题的答案是否定的。Kali 的内核与 fedora 完全一样配置了该参数,但在 Kali 中计算了 wchan 值。OpenSuse Tumbleweed 的行为与 fedora 一样,不计算 wchan 值。Devuan 计算 wchan。

缺少 wchan 值可能是由于

CONFIG_SCHED_OMIT_FRAME_POINTER:单深度 WCHAN 输出

在我的内核中配置为

CONFIG_SCHED_OMIT_FRAME_POINTER=y

答案1

这是一个Fedora 错误至少影响 Fedora 31 和 32(#1879450)


请注意,您引用的 ps 手册页已过时 - 当前ps版本直接从中读取符号 wchan 信息/proc/$pid/wchan


看看堆栈遍历过程看来,如果没有框架指针,它根本无法工作。CONFIG_SCHED_OMIT_FRAME_POINTER不是这里唯一相关的参数,在 Fedora 上,相关的似乎还有:

ONFIG_UNWINDER_ORC=y
# CONFIG_UNWINDER_FRAME_POINTER is not set

也可以看看2013 年 Debian 错误报告关于 wchan 破损。


/proc/$pid/stack可以作为缺失的 wchan 信息的替代。

也可以看看我的答案回答类似的问题。

相关内容