【Linux】負荷状況の把握(ロードアベレージ/loadaverage)

Linux では、サーバの負荷を、ロードアベレージで確認することがあります。ロードアベレージは、CPU の使用率とは別の角度から、システム全体の込み具合を見るための指標です。

この記事では、ロードアベレージの意味と、確認するコマンド、CPU のコア数との比べ方を説明します。最後に、実際に負荷をかけたときの値の変化も確認します。

この記事でわかること
  1. ロードアベレージは、CPU を使っている・待っているプロセスと、ディスク I/O などの完了を待っているプロセスの数を、1分・5分・15分で平均した値であること
  2. uptime、top、htop でロードアベレージを確認する方法と、CPU のコア数と比べて読むこと
  3. 負荷をかけると、1分平均が先に上がり、15分平均は少し遅れてついてくること

ロードアベレージの概要

ロードアベレージ(load average)は、一定の時間に、CPU を使っているプロセスと、CPU が空くのを待っているプロセスが、平均して何個あったかを表す値です。Linux では、これに加えて、ディスク I/O などの完了を待って止まっているプロセス(割り込みできないスリープの状態、D)も数えます。そのため、CPU の使用率が低くても、ロードアベレージが高くなることがあります。

ロードアベレージは、1分、5分、15分の3つの数字で表示されます。それぞれ、直近の1分間、5分間、15分間を対象にした平均です。ただし、単純な平均ではなく、新しい値ほど強く反映される指数移動平均で計算されています。

load average: 0.02, 0.02, 0.001分平均5分平均15分平均直近の1分間・5分間・15分間の、実行中・待ちのプロセス数の平均
図1 uptime の表示にあるロードアベレージ。左から、1分平均、5分平均、15分平均

図の例では、3つの値がすべて 0 に近く、CPU を使っているプロセスも、待っているプロセスもほとんどないことがわかります。

CPU の使用率は、ある瞬間の使われ方を示すので、短い時間で大きく変動します。ロードアベレージは、3つの時間枠を並べて見られるため、負荷が上がってきているのか、下がってきているのかという動きを読み取れます。たとえば、1分平均が 15分平均より大きければ、負荷は上がってきています。

パフォーマンス監視

ロードアベレージは、uptime、top、htop などのコマンドで確認できます。

画面イメージについて

この記事の画面は、実際の画面ではなく、実行時の画面から見るポイントを抜き出して描いたイメージです。長い出力は途中を省略しています。

uptime

uptime は、現在の時刻、システムの稼働時間、ログインしているユーザ数に加えて、ロードアベレージを表示します。

ターミナル画面イメージ
$ uptime1 12:50:16 up  8:28,  2 users,  load average: 0.05, 0.02, 0.00
図2 uptime の実行結果(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1load average: 0.05, 0.02, 0.001分平均、5分平均、15分平均のロードアベレージ。この例では、3つとも 0 に近い

そのほかの項目は、左から順に、現在の時刻、稼働時間(up 8:28 は、8時間28分)、ログインしているユーザ数です。

top

top は、実行中のプロセスの情報を、リアルタイムで表示するコマンドです。画面の最初の行に、ロードアベレージが表示されます。その下には、プロセスの数、CPU の使用率、メモリの使用量などが表示されます。

ターミナル画面イメージ
1top - 12:54:42 up  8:33,  2 users,  load average: 0.15, 0.03, 0.01Tasks: 171 total,   1 running, 170 sleeping,   0 stopped, …%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa, …MiB Mem :   1974.4 total,    520.5 free,    250.6 used, …MiB Swap:   2048.0 total,   2046.2 free,      1.8 used. …
図3 top の画面の上部(実際の画面ではなく、表示内容のポイントを示したイメージです。長い行は途中を省略しています)
No.表示意味
1load average: 0.15, 0.03, 0.011行目の右側に表示される、1分平均、5分平均、15分平均のロードアベレージ

htop

htop は、top を使いやすくしたコマンドで、プロセスとリソースの使用状況を、対話的に表示します。CPU ごとの使用率が棒グラフで表示されるので、どの CPU が使われているのかを、ひと目で確認できます。

htop は、別途インストールが必要です。Ubuntu では、次のコマンドを実行します。

sudo apt install htop

インストール後に htop と入力すると、画面が起動します。画面の右上に、ロードアベレージが表示されます。

ターミナル(htop)画面イメージ
  0[|               0.5%]  1[                0.0%]  2[                0.0%]  3[                0.0%]  4[                0.0%]  5[                0.0%]  6[                0.0%]  7[                0.0%]Mem[||||||||||||236M/1.93G]Swp[|        1.76M/2.00G]Tasks: 38, 39 thr; 1 running1Load average: 0.00 0.02 0.00Uptime: 08:41:06
図4 htop の画面の上部。何も実行していない状態(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Load average: 0.00 0.02 0.001分平均、5分平均、15分平均のロードアベレージ。htop では、スペース区切りで表示される
補足:ロードアベレージの元になるファイル

uptime、top、htop は、いずれも /proc/loadavg を参照して、ロードアベレージを表示しています。/proc/loadavg の最初の3つの数字が、1分、5分、15分の平均です。

ロードアベレージの値について

ロードアベレージ値の考え方

ロードアベレージは、CPU の数(コア数)と合わせて見ます。ロードアベレージは、CPU の数で割った値ではなく、プロセスの数そのものの平均だからです。たとえば、コアが4つのサーバでロードアベレージが 4 なら、すべてのコアがふさがっている状態です。同じ 4 でも、コアが1つのサーバなら、3つ分のプロセスが順番を待っている状態になります。

レストランの例で考えます。レストランに、料理を作れるキッチン(CPU のコア)が1つだけあるとします。キッチンは、一度に1つの料理(プロセスの処理)しか作れません。ロードアベレージは、このキッチンの忙しさを表します。

ロードアベレージキッチンが1つの場合
0キッチンは空いていて、注文はすぐに処理できる
1キッチンは常にふさがっているが、注文は待たされない
1より大きい注文が待たされる。大きいほど、待っている注文が多い

キッチンが増える(コア数が増える)と、同時に処理できる注文も増えます。キッチンが2つなら、ロードアベレージが 2 になるまでは、注文が待たされません。

ロードアベレージCPUコア(8コアの例)0ほとんど何も実行していない11コアがふさがっている22コアがふさがっている88コアすべてがふさがっている10待ち2つが順番待ち紺の箱は処理中のコア、破線の箱は順番待ちのプロセス
図5 8コアの場合のロードアベレージの見方

CPU のコア数は、htop の画面の左側にある CPU の数で確認できます。この環境では、0 から 7 までの8つの CPU が表示されていて、コア数は 8 です。

ターミナル(htop)画面イメージ
1  0[                0.0%]  1[                0.0%]  2[                0.0%]  3[                0.0%]  4[                0.0%]  5[                0.0%]  6[                0.0%]  7[                0.0%]Mem[||||||||||||242M/1.93G]Swp[|        1.76M/2.00G]Tasks: 38, 38 thr; 1 running2Load average: 0.01 0.02 0.00Uptime: 09:26:07
図6 htop でコア数を確認する(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
10 から 7 の CPUCPU が8つ表示されている。コア数は 8
2Load average: 0.01 0.02 0.00ロードアベレージ。コア数 8 に対して、ほとんど使われていない

次のコマンドでも、CPU のコア数を確認できます。

hirotano@ubuntu-1:~$ grep cpu.cores /proc/cpuinfo | sort -u 
cpu cores       : 8
補足:コア数の確認方法

/proc/cpuinfo の cpu cores は、CPU(物理パッケージ)1つあたりのコア数です。CPU が複数ある場合や、ハイパースレッディングが有効な場合は、OS が見ている論理 CPU の数と一致しないことがあります。ロードアベレージと比べるときは、nproc コマンドの結果(利用できる論理 CPU の数)を使うと確実です。

ロードアベレージ値の確認(負荷テスト)

実際に負荷をかけて、ロードアベレージの変化を確認します。ここでは、8つのコアのうち1つの CPU に、stress コマンドで負荷をかけます。stress コマンドは、-c オプションで、CPU に負荷をかけるプロセスの数を指定できます。

次の画面は、負荷をかけ続けたあとの htop です。1分平均は 1.01、5分平均は 0.99 で、1つの CPU がふさがっていることがわかります。15分平均の 0.70 は、まだ上がっている途中です。

ターミナル(htop)画面イメージ
  0[                0.0%]  1[                0.0%]1  2[||||||||||||||100.0%]  3[                0.0%]  4[                0.0%]  5[                0.0%]  6[                0.0%]  7[                0.0%]Mem[||||||||||||244M/1.93G]Swp[|        1.76M/2.00G]Tasks: 40, 38 thr; 2 running2Load average: 1.01 0.99 0.70Uptime: 09:46:28
図7 1つの CPU に負荷をかけたときの htop(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
12番の CPU が 100.0%1つの CPU に負荷がかかっている
2Load average: 1.01 0.99 0.701つの CPU がふさがっているので、1分平均と5分平均は 1 に近い。15分平均は、まだ 1 に向かって上がっている途中

2つの CPU に負荷をかけると、ロードアベレージは 2 に近づいていきます。次の画面は、負荷をかけ続けたあとの htop です。

ターミナル(htop)画面イメージ
  0[                0.0%]  1[                0.0%]  2[                0.0%]1  3[||||||||||||||100.0%]  4[                0.0%]  5[                0.0%]  6[                0.0%]  7[||||||||||||||100.0%]Mem[||||||||||||246M/1.93G]Swp[|        1.76M/2.00G]Tasks: 41, 38 thr; 3 running2Load average: 2.02 1.92 1.43Uptime: 10:00:41
図8 2つの CPU に負荷をかけたときの htop(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
13番と7番の CPU が 100.0%2つの CPU に負荷がかかっている
2Load average: 2.02 1.92 1.432つの CPU がふさがっているので、1分平均は 2 を超え、5分平均も 2 に近い。15分平均は、まだ上がっている途中

1分・5分・15分の値の動き方

負荷をかけ始めても、3つの値が同時に 1 や 2 になるわけではありません。1分平均が最初に上がり、5分平均、15分平均の順に、時間をかけて追いついてきます。上の2つの画面でも、15分平均だけが、1や2に届いていません。

たとえば、ロードが 0 の状態から、ロードアベレージが 1 になる負荷をかけ続けた場合の値は、計算上、次のように変化します。

負荷をかけてからの時間1分平均5分平均15分平均
10分1.000.860.49
20分1.000.980.74

このため、15分平均が 0.70 まで上がっている1つ目の画面は、負荷をかけ始めてから、15分以上たった時点の画面だと考えられます。逆に、負荷が収まったあとも、15分平均はゆっくり下がるので、少し前まで負荷が高かったことが読み取れます。

ロードアベレージが高くなる原因

ロードアベレージが高い原因は、CPU の使用率が高いことだけではありません。ディスク I/O の遅延や、メモリ不足によるスワップの発生などで、I/O の完了を待つプロセスが増えても、ロードアベレージは高くなります。

ロードアベレージがコア数を超えたときは、パフォーマンスに問題が起きているかもしれません。ただし、それだけで原因は決まらないので、top や htop で、CPU の使用率、I/O 待ち(top の wa)、プロセスの状態(S の列で、R は実行中・実行待ち、D は I/O などの完了待ち)を確認して、原因を切り分けます。

まとめ

ロードアベレージは、CPU を使っている・待っているプロセスと、I/O の完了を待っているプロセスの数を、1分・5分・15分で平均した値です。CPU のコア数と比べて、負荷の大きさと動きを確認します。

確認すること見方
3つの値1分、5分、15分の順に並ぶ。1分平均が15分平均より大きければ、負荷は上がってきている
コア数との比較コア数以下なら、CPU には余裕がある。コア数を超えたら、待っているプロセスがいるので、原因を確認する
確認するコマンドuptime、top、htop でロードアベレージを確認する。htop は CPU ごとの使用率も見られる
高いときの原因CPU の使用率だけでなく、ディスク I/O の遅延やスワップでも高くなる

コメント