プロセスとシグナル

INPUT · スライド

いま重いのは誰か(`top`)

01 / 08

写真では分からないこと

pspstree で、動いているものと親子関係が見えるようになったね。

でも困ることがあるよ。「いま重い」が分からないんだ。

~ $ psPID   USER     COMMAND    1 root     init   78 manabiya -sh

この一覧を見ても、どれが CPU を食っているか書いていないでしょう。

ps が見せているのはその瞬間の写真だよ。重さは「ある時間のあいだにどれだけ動いたか」なので、写真1枚では測れないんだ。

だから動画で見る道具が要る。それが top だよ。

02 / 08

top は動き続ける

top は打つと画面いっぱいに表示を出して、数秒ごとに書きかえ続けるよ。

~ $ topMem: 6880K used, 15904K free, ...CPU:   0% usr   9% sys   0% nic  90% idleLoad average: 0.00 0.00 0.00 2/35 85  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND   85    78 manabiya R     1648   7%   9% top   78     1 manabiya S     1644   7%   0% -sh

プロンプトは返ってこないよ。less と同じで、抜けるまで待つタイプのコマンドなんだ。

抜け方は2つあるよ。

  • q を押す
  • Ctrl-C を押す

q で抜けるのは less と同じだね。画面を占めるコマンドは q と覚えておくと、たいてい当たるよ。

03 / 08

上の4行を読む

画面の上の4行が、機械ぜんたいの様子だよ。

Mem: 6880K used, 15904K free, 1840K shrd, 0K buff, 1840K cachedCPU:   0% usr   9% sys   0% nic  90% idle   0% ioLoad average: 0.00 0.00 0.00 2/35 85  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND

1行目はメモリ。使っている量と空いている量だね。

2行目はCPU の使われ方だよ。

名前意味
usrあなたのプログラムが使った
sysカーネルが使った
idle何もしていない
ioディスク待ちで止まっている

いちばん見るのは idle だよ。ここが 0% に近ければ「CPU が満杯」だね。

4行目は下に並ぶ表の見出しで、列は8つあるよ。

04 / 08

Load average の読み方

3行目の Load average は、少し独特な数字だよ。

Load average: 0.00 0.00 0.00 2/35 85              ↑    ↑    ↑    ↑    ↑              1分  5分  15分 動/全 最後のPID

3つの数は 「順番待ちしているプロセスの平均の数」 で、左から1分・5分・15分ぶんだよ。

読み方の目安はこうだよ。

  • CPU の数と同じくらい … ちょうど働いている
  • CPU の数より大きい … 待ち行列ができている(重い)
  • 0 に近い … ひま

この Linux の CPU は1つなので、1.00 を超えたら混みはじめ、ということだね。

3つ並んでいるのが親切なところだよ。1分だけ高いなら一時的、15分も高いならずっと重いと分かる。原因を探すときに、この差が手がかりになるんだ。

うしろの 2/35 は「動いているもの / ぜんぶ」の数で、最後の数はいちばん新しい PID だよ。

05 / 08

並べかえて犯人を探す

top を開いているあいだ、キーを押すと並べかえられるよ。

キー並べかえる基準
PCPU の使用率(既定)
Mメモリの使用量
NPID
T使った時間の合計
Rいまの並びを逆にする

覚えるのは PM だけで足りるよ。

困りごとの原因は、たいてい「CPU を食っている」か「メモリを食っている」かのどちらかだからね。

重い    → P(CPU の多い順)落ちる  → M(メモリの多い順)

動きが遅いときは P、メモリ不足で落ちるときは M だよ。

上から1〜2行を見れば犯人はほぼ分かる。top を開いて M を押す、これだけで解決する困りごとが本当にあるんだ。

06 / 08

-b でファイルに残す

top は画面を占めるので、そのままでは記録に残せないよ。そこで -b(batch = 流し取り)を使うんだ。

~ $ top -b -n1 > t.txt~ $ head -4 t.txt

-b は「画面を書きかえずに、文字を流すだけ」という指定だよ。だから > でファイルに落とせるし、grep にも渡せる。

-n は回数だよ。-n1 なら1回ぶんで終わる。

top -b -n1        1回ぶん取って終わりtop -b -n5 -d 2   2秒ごとに5回ぶん取る

-d は間隔(秒)だね。

この形はあとで原因を調べるときに使うよ。夜中に重くなるサーバーの様子を、-b で1分ごとにファイルへ書き足しておく、というふうにね。

人が見ていない時間の記録が残るわけだ。章12で crontab をやると、これを自動でできるようになるよ。

07 / 08

freeuptime/proc

top の上4行だけが知りたいなら、専用の小さな道具もあるよ。

~ $ free              total   used   free  shared ...Mem:          22784   4592  16028    1840Swap:             0      0      0~ $ uptime 15:04:31 up 0 min,  load average: 0.08, 0.01, 0.00

free はメモリだけ、uptime は動いている時間と Load average だけを出すよ。画面を占めないので、記録に残しやすいんだ。

元をたどると、どちらも /proc を読んでいるだけだよ。

~ $ cat /proc/loadavg0.08 0.02 0.01 2/35 95~ $ head -3 /proc/meminfoMemTotal:          22784 kBMemFree:           16028 kB

前の回で /proc/自分の番号/stat を読んだのと同じ場所だね。カーネルがその場で作って見せている「いまの状態」だよ。

道具が無くても数字は取れる、ということだね。

08 / 08

さあ、打ってみよう

この回で使うのはこれだけだよ。

top              動かしながら見る(q で抜ける)top -b -n1       1回ぶん流し取るfree             メモリだけuptime           動いている時間と Load averagecat /proc/loadavg

そしてわざと重くする練習もするよ。

yes > /dev/null &

yesy という文字をひたすら出し続けるコマンドだよ。/dev/null(捨て場)に流して、& でうしろに回す。こうすると CPU を全力で使う「犯人」ができるんだ。

作ったら必ず止めてね。止め方は kill %1 だよ(次のレッスンでちゃんとやるからね)。

この教材では問題が変わるたびに片づけてくれるけれど、本物のパソコンでは止めるまで回り続けるからね。