私が進行中のプロセスの状態は少し混乱しています。次のようになります。
$ 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
proc//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
(ルートのみ)、または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は計算を間違っていると思います。