Load Averageとは
ロードアベレージとは、システム全体の負荷状況を表す指標になっています。1CPUにおける単位時間あたりの実行待ちとディスクI/O待ちのプロセスの数で算出されると言われています。(CPUの実行権限が与えられているのを待っているタスクとディスクI/Oが完了するのを待っているタスクが該当します。)
高ければ高いほどサーバの負荷が高く、低ければ低いほど負荷が低い状態です。数値は整数で表示されますので、0.00以上になります。仮に、1サーバあたりのスループットをあげたい場合、ロードアベレージを下げられるようにできると、パフォーマンスが向上できます。
ロードアベレージの基準
では、どのくらいのロードアベレージであれば良いかを考えたいと思います。ロードアベレージが問題ないかを考える基準として、CPUが1コアの場合、1未満であれば、問題ないとされています。つまり、8コアであれば、8未満であれば、問題ないです。
CPUのコア数は、下記のコマンドで見ることができます。
$ grep cpu.cores /proc/cpuinfo | sort -u
cpu cores : 1
調べ方
- uptimeコマンド
$ uptime
# 12:00:00 up 1:09, 1 users, load average: 1.10, 2.34, 0.31
uptimeを実行すると、現在の時間、システムの稼働時間、ログインユーザ数、ロードアベレージを見ることができます。ロードアベレージは、3つ並んでいますが、左から、直近1分、5分、15分の平均値を表示しています。
見方としては、直近1分が高く、それ以外が低ければ、1分以内に負荷が起きたことがわかり、全ての数値が高ければ、ずっと負荷の起きている状態だということがわかります。
- wコマンド
$ w
12:00:00 up 211 days, 57 min, 1 users, load average: 0.09, 0.04, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 26 1月20 210days 0.64s 0.64s w
wを実行すると、ロードアベレージと、サーバに誰がログインしていて、何を実行しているのかを把握することができます。
- topコマンド
top - 12:00:00 up 211 days, 58 min, 1 users, load average: 0.02, 0.03, 0.05
Tasks: 116 total, 2 running, 114 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.1 st
KiB Mem : 2046896 total, 85364 free, 178900 used, 1782632 buff/cache
KiB Swap: 4194300 total, 4107552 free, 86748 used. 1569176 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30670 root 20 0 396248 22756 12840 S 1.3 1.1 0:00.55 php
topを実行すると、ロードアベレージと、CPU使用率、メモリなどサーバ内の統計情報を表示してくれます。
ロードアベレージが高かった場合
ロードアベレージが高いということは、実行待ちのタスクが多い=タスクの処理が進んでいないという意味だと考えてください。何が原因かを調べるためには、もう少し調査をしなくてはいけません。
CPUの実行権限が与えられているのを待っているタスクとディスクI/Oが完了するのを待っているタスクが該当しますので、CPU、I/Oどちらが原因かを確認する必要があります。CPUがボトルネックの場合は、リクエストされるタスクに対し、CPUの計算処理が追いついていない状態です。CPUが高い状態だと、現環境だと処理が追いついていないため、対策を行ないましょう。I/Oがボトルネックの場合は、リクエストされるタスクに対し、ディスクとの入出力が追いついていない状態です。データベースなどではこの問題が起きやすいのですが、まずは、どちらが問題になっているか、確認するようにしましょう。
調べ方については、先ほど記載したtopコマンドを使っていきます。
top - 12:00:00 up 211 days, 58 min, 1 users, load average: 0.02, 0.03, 0.05
Tasks: 116 total, 2 running, 114 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.1 st
KiB Mem : 2046896 total, 85364 free, 178900 used, 1782632 buff/cache
KiB Swap: 4194300 total, 4107552 free, 86748 used. 1569176 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30670 root 20 0 396248 22756 12840 S 1.3 1.1 0:00.55 php
上記のように調べると、CPUの使用率がわかります。1コアあたりのCPU使用率が平均して、80%以上であれば、CPUがボトルネックで負荷が高い可能性が高いです。
負荷の高いプロセスを特定するには、pidstatコマンドが有効です。
$ pidstat
I/Oについては、下記のコマンドで確認ができます。
$ sar 5 10
CPU %user %nice %system %iowait %steal %idle
all 1.21 0.00 0.67 0.00 0.07 98.05
ここに記載されるiowaitの値が高くなっていた場合は、I/Oがボトルネックの可能性が高いです。40%以上になっていたら、I/Oを疑ってみてください。このようなことから、ロードアベレージが高く、CPUの使用率が低い状態で、iowaitが高ければ、I/Oが原因であると言えるでしょう。
まとめ
ロードアベレージを見るには、w、top、uptimeを使うことがわかりました。サーバ負荷が高い状況時に、詳細を確認するために実行することが多々あるかと思います。コマンドを実行するときは、top以外のwコマンドか、uptimeコマンドを使うことをお勧めします。理由としては、topコマンドは、ロードアベレージ以外の統計情報の取得を行なうため、やや処理が重たいです。そのため、負荷の高い状況下で実行すると、コマンドが返ってこない、逆に負荷になることが考えられます。なので、負荷の高い時は、wかuptimeを使うのが良いでしょう。