高負荷の問題に悩んでいるRedisを実行しているUbuntuサーバーがあります。
# uptime
05:43:53 up 19 min, 1 user, load average: 2.96, 2.07, 1.52
# 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
34オープンredis-server
接続:
$ Sudo netstat -natp | grep redis-server | wc -l
34
$ free -g
total used free shared buffers cached
Mem: 14 6 8 0 0 2
-/+ buffers/cache: 4 10
Swap: 0 0 0
どのプロセスが高負荷を引き起こしていて、Running
状態になるのを待っているかを知るにはどうすればよいですか?接続数が多すぎませんか?
Iowaitが高いため、予期しないloadavgが表示されています。トップのwa
セクションの98.7はこれを示しています。スクリーンショットから、プロセスがディスクI/Oの完了を待機しているときに発生するkworkerプロセスも無停電スリープ(上部のDの状態)にあることがわかります。
vmstat
を使用すると、実行キューを確認できます。実行vmstat 1
毎秒更新のための典型的なsar
形式で。
R列は、カーネルがloadavgを計算するために使用する実行可能/実行中のプロセスを示し、b列は、ディスクI/O、つまり無停電スリープを待機してブロックされたプロセスを示します。 bのプロセスがloadavg計算に追加されます。これは、iowaitが不可解なloadavgを引き起こす方法です。
したがって、どのprocが高loadavgを引き起こしているかを確認する方法の質問に答えるには、iowaitの場合、top
/ps
を使用してDの状態のprocを探し、そこからトラブルシューティングします。
Linuxは、他のほとんどすべてのUnixのようなOSとは異なり、CPUを使用してプロセスをカウントしたり、実行キューでCPUを待機したりして、その負荷計算の参照としてカウントしているだけでなく、プロセスの数(実際にスレッド)も追加しています無停電状態、つまりディスクまたはネットワークI/Oが完了するのを待っています。後者は実際にはアイドル状態です。つまり、CPUを使用していません。
その場合、おそらく(それほどではない)高負荷について心配することは何もありません。あなたが探しているプロセスは、シングルスレッドredis
と一時的なカーネルスレッドである可能性があります。