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が主流になってきている。これらのツールを使いこなす力も必要になってきているなと感じる。


以下の本にロードアベレージについて解説があったので、参考にさせてもらった。

投稿日 2020年12月19日