我在跑步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 信息的替代。
也可以看看我的答案回答类似的问题。