web-dev-qa-db-ja.com

負荷平均が高い:どのプロセスがキューで待機していますか?

高負荷の問題に悩んでいるRedisを実行しているUbuntuサーバーがあります。

法医学

稼働時間

# uptime
05:43:53 up 19 min,  1 user,  load average: 2.96, 2.07, 1.52

sar

# sar -q 
05:24:00 AM       LINUX RESTART

05:25:01 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
05:35:04 AM         0       116      3.41      2.27      1.20         4
Average:            0       116      3.41      2.27      1.20         4

htop

CPUの使用率はhtopで非常に低くなっています: enter image description here

enter image description here

netstat

34オープンredis-server接続:

$ Sudo netstat -natp | grep redis-server | wc -l
34

enter image description here

自由

$ free -g
             total       used       free     shared    buffers     cached
Mem:            14          6          8          0          0          2
-/+ buffers/cache:          4         10
Swap:            0          0          0

どのプロセスが高負荷を引き起こしていて、Running状態になるのを待っているかを知るにはどうすればよいですか?接続数が多すぎませんか?

6
Adam Matan

Iowaitが高いため、予期しないloadavgが表示されています。トップのwaセクションの98.7はこれを示しています。スクリーンショットから、プロセスがディスクI/Oの完了を待機しているときに発生するkworkerプロセスも無停電スリープ(上部のDの状態)にあることがわかります。

vmstatを使用すると、実行キューを確認できます。実行vmstat 1毎秒更新のための典型的なsar形式で。

enter image description here

R列は、カーネルがloadavgを計算するために使用する実行可能/実行中のプロセスを示し、b列は、ディスクI/O、つまり無停電スリープを待機してブロックされたプロセスを示します。 bのプロセスがloadavg計算に追加されます。これは、iowaitが不可解なloadavgを引き起こす方法です。

したがって、どのprocが高loadavgを引き起こしているかを確認する方法の質問に答えるには、iowaitの場合、top/psを使用してDの状態のprocを探し、そこからトラブルシューティングします。

13
Creek

Linuxは、他のほとんどすべてのUnixのようなOSとは異なり、CPUを使用してプロセスをカウントしたり、実行キューでCPUを待機したりして、その負荷計算の参照としてカウントしているだけでなく、プロセスの数(実際にスレッド)も追加しています無停電状態、つまりディスクまたはネットワークI/Oが完了するのを待っています。後者は実際にはアイドル状態です。つまり、CPUを使用していません。

その場合、おそらく(それほどではない)高負荷について心配することは何もありません。あなたが探しているプロセスは、シングルスレッドredisと一時的なカーネルスレッドである可能性があります。

4
jlliagre