【Linux】ロードアベレージが高いときの調査方法
概要と前談
私は、とある小さな企業で一人でサービスの開発、保守・運用をしているエンジニアである。
殿事業とはいえ、実務未経験でいきなりすべてを任されることになった。
もちろんそれほどLinuxなんぞ知らん状態であっても、担当者の力量など一切おかまいなしに、突然サーバーのアラートが上がる。そんなとき必死に調べておいたことを記しておく。
Load averageとは
コンピュータの負荷を表す指標の一つで、CPUに割り当てられた実行待ちプロセス数の平均値。
この値が大きいほど性能に対して負荷が過大になっている状態。
ロードアベレージが問題ないかを考える基準として、CPUが1コアの場合、1未満であれば、問題ない。2コアなら2未満。
なので、まずはサーバーが何コア搭載かを調べておく。
コア数調べるには下記コマンド
grep cpu.cores /proc/cpuinfo | sort -u
AWSのEC2の場合の参考)
https://aws.amazon.com/jp/ec2/instance-types/
原因切り分け方
ロードアベレージが高かったとして、じゃあ何が原因かを知る必要がある。
アラートが入ったときに下記コマンドで今のLoad averageを調べる。
LoadAverageが高い時に調査を行わないと原因の切り分けが難しい。
uptime
もしリアルタイムでなかったとしても、下記コマンドで推移と発生時刻はわかる
sar -q
runq-sz:CPU を実行するためにメモリ内で待機中のカーネルスレッド数。通常この値は 2 未満
plist-sz:プロセスリストのプロセスとスレッド数
ldavg-1:過去1分間のロードアベレージ
ldavg-5:過去5分間のロードアベレージ
ldavg-15:過去15分間のロードアベレージ
そして原因の切り分けとして、大きく下記2つ
・CPU使用率
・I/O待ちが長い
それを判定するために下記コマンドを実行
-sの後は発生時刻
sar -u -s 21:00:00
項目意味
%user:アプリケーション(ユーザプロセス)が使用している状態
%system:カーネル(OSなど)が使用している状態
%iowait: ディスクI/O待ち状態
%idle:CPUが何の処理もしない待機状態(I/O待ちの時間は除く
%userか%systemが高いと、CPU使用率という切り分けができる。
%userが高いのはアプリケーション起因のCPU使用率がボトルネック
%systemが高いのはアプリケーション以外の要因で生じるCPU使用率がボトルネック
%iowaitが高いと、I/O待ちが長いという切り分け
この場合、
・スワップが発生している
・スワップが発生していない
の2つに分けられるので下記コマンド実行
sar -r -s 21:00:00
【スワップが発生している場合、メモリ不足がボトルネック】
sar -r -s 21:00:00
項目意味
kbmemfree:メモリ空き容量(kb)
kbmemused:メモリ使用量(kb)
%memused:メモリ使用率
kbswpfree:スワップ空き容量(kb)
kbswpused:スワップ使用量(kb)
%swpused:スワップ使用率
スワップが発生していない場合、ディスクI/Oがボトルネック
sar -b -s 21:00:00
tps:秒間I/Oリクエスト 数の合計。
rtps:秒間読み込みIOリクエスト数の合計。
wtps:秒間書き込みIOリクエスト数の合計。
bread/s:秒間読み込み(ブロック単位)IOリクエストのデータ量の合計。
bwrtn/s:秒間書き込み(ブロック単位)IOリクエストのデータ量の合計