我对我拥有的流程的状态有点困惑。它看起来像这样:
$ 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
-- 所以,状态是S
,man
页面描述为“S 可中断睡眠(等待事件完成)”,它正在等待某个事件。我认为它已列在某个等待频道中。但等待通道是:WCHAN -
。哪个man
页面描述了“正在运行的任务将在此列中显示破折号('-')。”
另外,/proc/7843/status
确实包含State: S (sleeping)
和/proc/7843/wchan
包含0
。我想0
inproc//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 会出现错误计算。