WCHAN = 0 对于睡眠任务?

WCHAN = 0 对于睡眠任务?

我对我拥有的流程的状态有点困惑。它看起来像这样:

$ ps -eal | head -n 1 ; ps -eal | grep perf
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  7843  7842  0  80   0 - 10838 -      pts/6    00:00:00 perf

-- 所以,状态是Sman页面描述为“S 可中断睡眠(等待事件完成)”,它正在等待某个事件。我认为它已列在某个等待频道中。但等待通道是:WCHAN -。哪个man页面描述了“正在运行的任务将在此列中显示破折号('-')。”

另外,/proc/7843/status确实包含State: S (sleeping)/proc/7843/wchan包含0。我想0inproc//wchan讲述了同样的事情——任务不会等待任何事情。

我是否误解了什么或者它们相互矛盾?

而且任务确实没有运行——我不认为-wchan意味着它正在等待安排。

输出是否可能wchan配置错误?我运行 Ubuntu 14.04,内核 3.13.0-86-generic。

检查其他进程显示:

$ ps -eal | head -n 1 ; ps -eal | grep fish
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  2407  2399  0  80   0 - 47675 wait   pts/0    00:00:07 fish
1 S  1000  2409     1  0  80   0 -  5500 poll_s ?        00:00:00 fishd
0 S  1000  2507  2399  0  80   0 - 45333 poll_s pts/3    00:00:00 fish
0 S  1000  2567     1  0  80   0 -  8366 wait   ?        00:00:00 fish

——所以这里WCHAN没问题。

答案1

请注意,进程状态和 wchan 不会由内核自动返回。

这意味着在访问进程的状态和获取其 wchan 信息之间,其状态很可能从睡眠状态变为运行状态。

因此,有一场竞赛。

栈行走过程在内核内部获取 wchan 信息也是有问题的,并且可能无法涵盖所有​​情况。

您可以交叉检查cat /proc/$pid/stack(仅限 root)或cat /proc/$pid/syscall获取有关进程在内核中的位置的一些附加信息。

答案2

WCHAN 值似乎是计算出来的。来自内核源代码arch/x86/Kconfig

config SCHED_OMIT_FRAME_POINTER 
   Single-depth WCHAN output
   Calculate simpler /proc/<PID>/wchan values. If this option
   is disabled then wchan values will recurse back to the
   caller function. This provides more accurate wchan values,
   at the expense of slightly more scheduling overhead.

和来自Documentation/filesystem/proc.txt

wchan Present with CONFIG_KALLSYMS=y: it shows the kernel function
      symbol the task is blocked in - or "0" if not blocked.

所以我想有时 wchan 会出现错误计算。

相关内容