Linux入門:コマンド操作のきほん
topでリアルタイム監視する
ps は一瞬の写真しか撮れない
ps で一覧を出したときは何ともなかったのに、体感ではずっと重い。原因が数秒おきに入れ替わっている場合、写真を 1 枚撮っただけでは捕まえられません。動きを見続けるための道具が top です。数秒ごとに画面を描き直して、今まさに資源を使っているものを上に押し上げてくれます。
上の数行だけで当たりが付く
プレーンテキスト
top - 09:00:00 up 12 days, 2 users, load average: 3.20, 1.05, 0.42
Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.2 us, 1.0 sy, 14.5 id, 80.1 wa, 0.0 st
MiB Mem : 3919.0 total, 180.2 free, 3200.4 used1 行目の右端が、直近 1 分、5 分、15 分の平均待ち行列の長さです。この例では 1 分平均が 3.20 で、15 分平均の 0.42 よりずっと大きくなっています。つまり、つい今しがた何かが起きたと読めます。逆に 15 分平均のほうが大きければ、山はもう過ぎたところです。
ターミナル
$ uptime
09:00:00 up 12 days, 2 users, load average: 3.20, 1.05, 0.42同じ 3 つの数字は uptime でも見られます。目安は CPU のコア数で、コア数を超えていれば順番待ちが起きています。
待ち行列が伸びていても、CPU が原因とは限らない
3 行目が、CPU の時間が何に使われたかの内訳です。
| 表示 | 何に使われた時間か |
|---|---|
| us | アプリ自身の計算 |
| sy | カーネルの処理 |
| id | 何もしていない |
| wa | ディスクなどの応答待ち |
さきほどの例は us が 4.2 と低いのに、wa が 80.1 まで上がっています。CPU は暇なのに、ディスクの応答を待って動けない状態です。ここで CPU の強いマシンに載せ替えても、何も改善しません。逆に us が高いなら計算そのものが重いということなので、処理の中身か台数を見直す話になります。
同じ「重い」でも打つ手が正反対になるので、この 1 行は必ず見ます。
画面を奪われずに 1 回だけ取る
ターミナル
$ top -b -n 1 | head -5top は画面全体を書き換えるので、そのままではログに残せず、他のコマンドにもつなげられません。-b を付けると画面の制御をやめてただの文字列として吐き、-n 1 で 1 回出したら終了します。この形なら grep に渡せますし、ファイルに書き出して後から比べることもできます。
定期的に
top -b -n 1を書き出しておくと、障害の後で「そのとき何が動いていたか」を追えます。重くなってから調べ始めると、原因のプロセスは既に消えていることが多いです。