load averageとは
ロードアベレージはシステム全体の負荷状況を表す指標。
「1CPUにおける単位時間あたりの実行待ちとディスクI/O待ちのプロセスの数」で表される。
システムのスループットを上げたい場合はロードアベレージを下げることを目標にする。
詳細な説明
Linuxカーネルはプロセス1つごとにプロセスディスクリプタを持っていて、そのstateメンバにプロセスの状態を入れて管理している。
プロセスの状態は以下のように区別される。
- TASK_RUNNING: 実行可能な状態。CPUが空いていれば実行できる。
- TASK_UNINTERRUPTABLE: 割り込み不能な待ち状態。ディスクI/O待ちなど、短時間で復帰するもの。
- TASK_INTERRUPTABLE: 割り込み可能な待ち状態。ユーザの入力待ちなど、復帰時間が予測できないもの。
- TASK_STOPPED: 実行中断になった状態。リジュームされるまでスケジューリングされない。
- TASK_ZOMBIE: ゾンビプロセス。子プロセスがexitして親プロセスにwaitされていないもの。
run queueに入っているプロセスのうち、TASK_RUNNINGとTASK_UNINTERRUPTABLEのものがload averageとして換算される。
load average、つまりシステムの負荷とは、**「CPUの実行権限が与えられるのを待っているプロセス」と「ディスクI/Oの完了を待っているプロセス」**の多さのことである。
load averageを見れるコマンド
uptime
$ uptime
# 11:52:38 up 3:12, 2 users, load average: 2.90, 0.64, 0.25
システムの稼働時間を見るコマンド。
それ以外に、現在の時間と、ログインユーザの数と、load averageが見れる。
load averageは、左から、直近1分, 5分, 15分間で計測したものを表している。
watch uptime
のようにすれば変化を監視できるが、その場合は後述のtop
を使っても良い。
w
$ w
# 11:58:45 up 3:18, 2 user, load average: 0.06, 1.19, 0.87
# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
# isucon pts/0 i100-100-80-200. 11:59 6.00s 0.00s 0.00s top
# isucon pts/1 i100-100-80-200. 08:42 5.00s 0.02s 0.00s w
システムに誰がログインしていて何をしているかを表すコマンド。
1行目はuptime
と同じものが表示される。
top
$ top
# top - 12:05:42 up 3:25, 2 users, load average: 1.12, 2.24, 1.47
# Tasks: 92 total, 1 running, 91 sleeping, 0 stopped, 0 zombie
# Cpu(s): 2.3%us, 0.3%sy, 0.0%ni, 97.2%id, 0.1%wa, 0.0%hi, 0.0%si, 0.1%st
# Mem: 15144564k total, 1326668k used, 13817896k free, 41508k buffers
# Swap: 0k total, 0k used, 0k free, 502256k cached
システムの様々な統計を同時に表示し変化を監視することができるコマンド。
万能だが、solarisなどのOSでは入ってないことがあるので上記のようなコマンドを使う必要がある。
機能が多いので、詳しい使い方はtopコマンドの使い方に書いた。
まとめ
uptime
, w
, top
などを使うとシステムの負荷状況を表すload averageを見ることができる。