Linuxで多くのコンテキストスイッチを生成しているタスクを調べる


11

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タスクが1秒あたり10を超えるコンテキスト切り替えを実行しているように見えますが、いずれにしても合計で20kになるわけではありません。

答えをもう少し掘り下げる方法はありますか?


postgreについてのことは、それらが異なるpidですので完全に異なるプログラムです。
Gopoi

回答:


5

まあ、非常に興味深いケースです。観察してみてくださいwatch -tdn1 cat /proc/interrupts。そこで重要な変更がありますか?


「ローカルタイマー割り込み」は、各CPUコアで数百(200〜800)の割り込みを生成しています。それはどういう意味ですか?また、eth0-rx / txは、そのサーバー上のトラフィックのためにいくつかの割り込みを生成していますが、それほど多くはありません。
grzaks

「関数呼び出し割り込み」はどうですか?
poige

10

使用してみてください

pidstat -wt

「t」オプションはスレッドも表示します。コンテキストの切り替えを行っているのはスレッドかもしれません。


1
pidstat -wtの実行| sort -n -k4の方が優れています。
イスマエルヴァッコ

2

新しいカーネルバージョン

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

1

コンテキストの切り替えは正常です。プロセスは時間のクォンタムに割り当てられます。プロセスが終了する(またはリソースが必要なために一時停止する)場合、プロセスを実行すると、プロセッサを解放できます。

それは、何回のコンテキスト切り替えが行われたかをカウントすると言いました(stackoverflow.comの回答になります)。プロセステーブルに書き込むには、内部カーネルのschedule()コマンドが必要です。A見ることができる独自のカーネルをプログラムする場合、そのようなことはありませんが、それは非常に困難です。


1
上手。コンテキストスイッチが何であり、システムパフォーマンスにどのような影響があるかを知っています。Linux上のどのプロセスに対して何回コンテキスト切り替えが行われたかを測定する方法が必要なだけです。Iすでに(voluntary_ctxt_switches)には/ proc / * /統計生CSWカウンターを見つけた
grzaks

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.