Vmstatによると、私のLinuxサーバー(2xCore2 Duo 2.5 GHz)は常に毎秒約2万回のコンテキストスイッチを実行しています。
# vmstat 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 7292 249472 82340 2291972 0 0 0 0 0 0 7 13 79 0
0 0 7292 251808 82344 2291968 0 0 0 184 24 20090 1 1 99 0
0 0 7292 251876 82344 2291968 0 0 0 83 17 20157 1 0 99 0
0 0 7292 251876 82344 2291968 0 0 0 73 12 20116 1 0 99 0
...しかしuptime
は小さな負荷を示します:load average: 0.01, 0.02, 0.01
およびtop
には、%CPU使用率が高いプロセスは表示されません。
これらのコンテキストスイッチを正確に生成しているものを見つけるにはどうすればよいですか?どのプロセス/スレッドですか?
pidstat
の出力を分析しようとしました:
# pidstat -w 10 1
12:39:13 PID cswch/s nvcswch/s Command
12:39:23 1 0.20 0.00 init
12:39:23 4 0.20 0.00 ksoftirqd/0
12:39:23 7 1.60 0.00 events/0
12:39:23 8 1.50 0.00 events/1
12:39:23 89 0.50 0.00 kblockd/0
12:39:23 90 0.30 0.00 kblockd/1
12:39:23 995 0.40 0.00 kirqd
12:39:23 997 0.60 0.00 kjournald
12:39:23 1146 0.20 0.00 svscan
12:39:23 2162 5.00 0.00 kjournald
12:39:23 2526 0.20 2.00 postgres
12:39:23 2530 1.00 0.30 postgres
12:39:23 2534 5.00 3.20 postgres
12:39:23 2536 1.40 1.70 postgres
12:39:23 12061 10.59 0.90 postgres
12:39:23 14442 1.50 2.20 postgres
12:39:23 15416 0.20 0.00 monitor
12:39:23 17289 0.10 0.00 syslogd
12:39:23 21776 0.40 0.30 postgres
12:39:23 23638 0.10 0.00 screen
12:39:23 25153 1.00 0.00 sshd
12:39:23 25185 86.61 0.00 daemon1
12:39:23 25190 12.19 35.86 postgres
12:39:23 25295 2.00 0.00 screen
12:39:23 25743 9.99 0.00 daemon2
12:39:23 25747 1.10 3.00 postgres
12:39:23 26968 5.09 0.80 postgres
12:39:23 26969 5.00 0.00 postgres
12:39:23 26970 1.10 0.20 postgres
12:39:23 26971 17.98 1.80 postgres
12:39:23 27607 0.90 0.40 postgres
12:39:23 29338 4.30 0.00 screen
12:39:23 31247 4.10 23.58 postgres
12:39:23 31249 82.92 34.77 postgres
12:39:23 31484 0.20 0.00 pdflush
12:39:23 32097 0.10 0.00 pidstat
いくつかのpostgresqlタスクが毎秒10を超えるコンテキストスイッチを実行しているように見えますが、いずれにしても合計が20kになるわけではありません。
答えを少し深く掘る方法はありますか?
まあ、かなり興味深いケースです。 watch -tdn1 cat /proc/interrupts
。そこで価値のある変化はありますか?
使ってみてください
pidstat -wt
't'オプションはスレッドも表示します。コンテキストの切り替えを行っているのはスレッドかもしれません。
新しいカーネルバージョン
Sudo perf record -e context-switches -a # record the events
# then ctrl+c
Sudo perf report # inspect the result
これにより、コンテキストスイッチイベントに関する正確な結果が得られます。
また、「-g」フラグを追加すると、コンテキストスイッチが発生した理由がわかる場合があります(読み取り可能な結果は、シンボル情報によって決定されます)。
Sudo perf record -e context-switches -a -g
コンテキストスイッチは正常です。プロセスは時間の量に割り当てられます。プロセスが終了した場合(またはリソースの必要性が原因で一時停止した場合)、実行する必要のある処理はプロセッサを解放します。
実行されたコンテキスト切り替えの数を数えると言われています(stackoverflow.comの回答になります)。プロセステーブルに書き込むには、内部カーネルのschedule()コマンドが必要です。 Aあなたが見ることができるあなた自身のカーネルをプログラムするならば、そのようなことはありませんが、それは非常に難しいです。
powertop
は、プロセスがCPUをウェイクアップする頻度を示します。