CPUの負荷状況とロードアベレージを見るための知識
Webアプリケーションの負荷状態を見るための知識を身に付けたいが、なかなか難しくて苦戦している。ノウハウがいるところなので一朝一夕にはいかない。一歩ずつ知識を蓄えていくしかない。今週はCPUの負荷状況とロードアベレージについて調べた。
vmstatコマンドの読み方
ページよって解説が違うのはなぜ・・? CPU周りを見ておきたい。us, sy, id, waが重要。
CPUの項目について
I/O負荷の正確な状況はiowaitでは分かりません - Qiita
iowaitとはあくまでも、CPUが空いているのにI/Oがボトルネックになっているプロセスを示しているだけで、CPUの利用率が高いときにはI/Oがボトルネックになっていてもiowaitが上がりません。 同様に勘違いされがちなのが、id(idle)はCPUの空きを示しているというものですが、idleは必ずしもCPUの空き時間を示しているものではありません。 us(user)がユーザプロセスでのCPU使用率、sy(system)がカーネルでのCPU使用率であり、userとsystemを足したものがいわゆるCPU使用率を示しています。 そして、user + system + idle + iowait は必ず100になります(ここではstの説明は省きます)。
つまり・・、こういうことかな。
- cpuの使用率を見るためには、us+syを見る
- cpuの使用率が低いときは、idleかiowaitのどちらかが上がる
- cpuが空いているのにI/Oがボトルネックになっているときはiowaitが上がる
ロードアベレージとは
聞いたことあるけど、あまり正確に理解していなかった。
LinuxのI/OやCPUの負荷とロードアベレージの関係を詳しく見てみる - Qiita
先ほどの項目で述べたとおり、ロードアベレージとはLinuxカーネルがCPUリソースを割り当てたプロセスの数と、I/O待ち状態が原因でCPUが利用されていないプロセスの合計を示しており、負荷状況を把握することができます。 I/O負荷が全く無い状態を仮定すると、1プロセスがCPUを100%占有している際にはロードアベレージが1となり、2プロセスで100%占有している場合は2となります。 ちなみに、CPUのコア数が1個の場合はロードアベレージが1になるとCPUが100%使用されている状態であり、コア数が16個の場合はロードアベレージ16になるとCPUが100%使用されている状態となります。 逆に、CPUの負荷がかかっていないのにロードアベレージが上昇している場合には、I/Oがボトルネックになっていることを示します。
load averageを見てシステムの負荷を確認する - Qiita
load average、つまりシステムの負荷とは、「CPUの実行権限が与えられるのを待っているプロセス」と「ディスクI/Oの完了を待っているプロセス」の多さのことである。
自分の理解
- ロードアベレージが高いということはシステムの負荷が高く、なんらかの対策が必要
- CPUのコア数と一致する値になれば、CPUが100%使えている事になる
単一サーバーの負荷を見る
Webアプリのスループットやレスポンスタイムの悪化がある場合、サーバーの負荷を調べる。 サーバーの負荷を見るためには、まずはロードアベレージを見るところから始める。
- ロードアベレージが高い場合は、CPUかI/Oに問題がある。
- CPUの状態はuser,systemのどちらが高いか。userであればプログラムの暴走が考えられる。
- I/Oは、ディスクアクセスの総量や、メモリのスワップアウトを調べるのが良い。
- ロードアベレージが低い場合は、外部に原因があることが多い
- ソフトウェア不具合や設定が誤っている
- データベースや外部システムとの通信が遅い
- 外部通信の量を見るために、サーバーからのネットワークI/OやTCPコネクション数を見ると良い
Webアプリだと複数のサーバーで構築されていることが多いので、全てのサーバーを見てみることも大切だ。さらにDBサーバーだとDB独自の注目ポイントもあるので、そういうところも見ていく必要がある。この辺りは今後知識として身に付けていきたい。
最近だと、vmstatとかsarを見ることはなくて、CloundWatch LogsやMackerel、Datadogが主流になってきている。これらのツールを使いこなす力も必要になってきているなと感じる。
以下の本にロードアベレージについて解説があったので、参考にさせてもらった。