top は稼働中のシステムの動的なリアルタイムの概要を報告します。
Linux カーネルが現在管理しているタスクの一覧だけでなく、 システムの概要情報も表示できます。
また、表示されるシステムの概要情報のタイプと各タスクについて表示される情報のタイプ・順序・サイズは、ユーザーが全て設定可能で、その設定は次に起動したときにも保存できるようになっています。
集客力のあるサイトを運営しているWebサーバやメーリングリストを運営しているサーバ、ソフトウェアを配布するFTPサーバ、ファイル共有をするためのサーバなどは、クライアントからの非常に多くの要求を処理する必要があります。
サーバの応答が遅い場合は、ハードウェアの増強などで対応する必要があります。ボトルネックの特定のためには、原因がCPUのパワー不足なのか、メモリ容量が足りていないのか、回線容量が細過ぎるのかなどを判断しなければなりません。そのほかにもハードディスク容量、マザーボードの温度、UPSの電力、メールの配送効率、Webページのアクセス解析など、運用中に注意して見ておく必要のあるデータは多くあります。
プロセス
プロセス関連の監視項目には、以下のようなものが挙げられます。
CPU使用率の高いプロセス
RAM使用率の高いプロセス
ゾンビプロセス(defunct)
特定のプロセスを確認したい場合はpsコマンドを使用することが多いのですが、「全プロセスの中でCPU負荷が大きい」あるいは「メモリ使用量が多いプロセスを見つけたい」といった、相対的に負荷が高いプロセスを確認する場合はtopコマンドの利用が適切です。サーバに何か起こった場合は、まずtopで問題のあるプロセスを特定することから作業を始めると思います。
topコマンドは、以下のようにシステム全体の情報を表示します。また、特定の項目でプロセスの並べ替えを行うことが可能です。デフォルトではCPUの使用率が高いプロセス順にソートされていますが、表1の1文字のコマンドを利用することで、目的に応じてプロセスを並べ替えることが可能です。
7:28pm up 26 days, 14:17, 2 users, load average: 0.06, 0.03, 0.11
75 processes: 70 sleeping, 5 running, 0 zombie, 0 stopped
CPU states: 0.5% user, 1.7% system, 6.5% nice, 91.0% idle
Mem: 190748K av,185588K used, 5160K free, 0K shrd, 32284K buff
Swap: 128480K av, 15356K used, 113124K free 85700K cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
2172 root 23 5 2552 2552 1620 R N 3.5 1.3 0:00 read-data.pl
2158 root 15 0 1096 1096 840 R 0.7 0.5 0:00 top
13 root 15 0 0 0 0 SW 0.1 0.0 2:44 kjournald
1 root 15 0 476 440 424 S 0.0 0.2 1:55 init
2 root 15 0 0 0 0 SW 0.0 0.0 0:00 keventd
3 root 15 0 0 0 0 SW 0.0 0.0 0:00 kapmd
4 root 34 19 0 0 0 SWN 0.0 0.0 0:00 ksoftirqd_CPU0
5 root 15 0 0 0 0 SW 0.0 0.0 0:13 kswapd
6 root 15 0 0 0 0 SW 0.0 0.0 0:00 bdflush
7 root 15 0 0 0 0 SW 0.0 0.0 0:00 kupdated
8 root 25 0 0 0 0 SW 0.0 0.0 0:00 mdrecoveryd
64 root 16 0 0 0 0 SW 0.0 0.0 0:00 khubd
164 root 15 0 0 0 0 SW 0.0 0.0 0:00 kjournald
485 root 15 0 608 456 456 S 0.0 0.2 0:00 cardmgr
523 root 15 0 464 416 416 S 0.0 0.2 0:00 apmd
649 root 15 0 1364 1256 1176 S 0.0 0.6 0:24 sshd
コマンド 機能
N プロセスID順
A 新しいタスク順
P CPUの使用時間率の長いもの順
M メモリ使用量が多いもの順
T 実行時間が長い順
u 特定のユーザー権限のプロセスだけを表示
(uコマンド入力後、「Which User (Blank for All):」というプロンプトが表示されるので、ユーザー名を入力して[Enter]キーを押す。何も入力しない場合は全ユーザーのプロセスが表示される)
s 表示の更新間隔を指定(単位は秒)
(sコマンド入力後、「Delay between updates:」というプロンプトが表示されるので、数値を入力して[Enter]キーを押す)
q TOPの終了
■CPU
計算量が多い処理を行うと、CPU負荷が高くなります。システム全体のCPUの利用状況を確認するためのコマンドとしては、vmstatなどさまざまなものが存在します(上記のtopコマンドでもシステム全体のCPU使用率が表示されます)。
■メモリ
メモリおよびスワップの状態を確認するには、freeコマンドが便利です。実行すると、以下のように表示されます。
# free
total used free shared buffers cached
Mem: 54272 52508 1764 12 2068 40984
-/+ buffers/cache: 9456 44816
Swap: 137780 12968 124812
メモリ使用量を確認する際、usedだけを見てしまうと正確な情報が分かりません。Linuxの場合、存在するメモリをできるだけ使用しようとするため、あまりプロセスを起動していなくても、9割以上は使用されている状態になります。
現実的にはfree+buffers+cachedが「自由な領域」と見なせる部分で、freeコマンドの実行例では「-/+ buffers/cache:」のusedが、実際にシステムを動作させるために「必要な」使用メモリです。
注:当然ですが、バッファやキャッシュ領域がまったく取れない状態ではシステムは動作しません。また、上記の場合、スワップ領域(Swap)を使用している状態になっていますが、スワップ・イン/アウトはハードディスクを利用するためパフォーマンスが悪くなります。Swapのusedが多いのは、メモリの増設によって速度向上が図れる可能性が高い状態です。
■ハードディスク
ディスクの使用状況を確認するには、dfコマンドを利用します。通常は、dfの結果を基に、どのディレクトリにあるファイルがディスクを圧迫しているのかをduで確認して対策を考えることになります。
■サーバとの接続性
ネットワークの情報は、さまざまな取得方法があります。各サーバとの接続性を確認する最も基本的な方法は、単純にpingを定期実行し、応答にかかる時間とパケットロスを監視することです。ただし、この場合はどこからpingを実行するのか、つまりEcho要求を出すホストとEcho応答を出すホストの経路が重要になることも認識する必要があります。
また、pingが通ったとしても、運用しているサービスが応答を返すかどうかは確認できません。TCPをトランスポート層で利用するサービスであれば、telnetコマンドで各TCPサービスとの接続性を簡単に確認できます。
以下のように、第2引数にポート番号を指定して実行すると、正常にコネクションが確立できる場合は結果1、確立できない場合は結果2のような表示になります。
telnet xxx.xxx.xxx.xxx:80
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
結果1
telnet xxx.xxx.xxx.xxx:80
Trying 127.0.0.1…
telnet: connect to address 127.0.0.1: Connection refused
結果2
■トラフィック量
トラフィック量に関しては、後述するSNMPというネットワーク管理プロトコルが広く利用されます。また、エラーパケットの数など基本的な項目に関してはifconfigでも確認できます。
また、netstatコマンドを利用すれば、ネットワークに関するさまざまな情報を取得することができます。netstatの使用方法については、「netstat – ホストのネットワーク統計や状態を確認する」を参照ください。
■サービス情報
監視したい項目は、サービスによってさまざまです。例えば、Webサーバであればクライアントの要求に正常に応答を返すか、ページのデータが改ざんされていないか、などを監視する必要があります。また、SMTPサーバであればキューにたまっているメール数などが監視項目として挙げられます
デーモン
デーモンを一部紹介します。
keventd・・・モジュール化されたデバイスドライバを自動的にロードする割込を発生させるコントロールデーモン
kapmd・・・パワーマネージメント関係のデーモン
ksoftirq_CPU0・・・ソフトIRQをCPU毎に順次処理するデーモン
kswapd・・・物理メモリが残り少なくって来たときに、必要に応じてディスク側のスワップ領域に書き込んだり読み込んだりコントロールをするデーモン
bdflushd・・・Linuxは構造的にファイルの書き込みを高速化するためにファイルに加えられた変更をメモリ上に一時的にメモって置くが、それを実際にディスクなどの記録媒体に書き込む機能を提供するデーモン
kupdated・・・USB機器の抜き差しを監視するデーモン
kjournald・・・ジャーナリング(データベースのようにデータを定期的に記録する構造)をサポートしたファイルシステムReiserFSやExt3 FSを使うときに必要なデーモン
起動時のデフォルト値
以下の起動時のデフォルトは、設定ファイルの使用を仮定していないので、ユーザーはカスタマイズできない。しかし、アスタリスク (‘*’) の付いたコマンドはコマンドラインで上書きできる。
全体のデフォルト
'A' - 別形式表示 Off (全画面)
* 'd' - 遅延時間 3.0 秒
'I' - Irix モード On ('solaris' smp ではない)
* 'p' - PID の監視 Off
* 's' - セキュアモード Off (非セキュアモード)
'B' - 太字表示 Off
サマリーエリアのデフォルト
'l' - 負荷平均/稼働時間 On (プログラム名が表示される)
't' - タスク/Cpu 統計 On (1+1 行。'1' を参照)
'm' - メモリ/スワップ使用量 On (2 行を使う)
'1' - シングル Cpu On (smp の場合 1 行になる)
タスクエリアのデフォルト
'b' - 太字によるハイライト On (背景と前景を「反転」しない)
* 'c' - コマンドライン Off (コマンドラインではない名前)
* 'i' - アイドルタスク On (全てのタスクを表示する)
'R' - 逆順ソート On (pid の降順でソートする)
* 'S' - 累積時間 Off (死んだ子プロセスを累積しない)
'x' - カラムのハイライト Off (フィールドをソートする)
'y' - 行のハイライト On (実行中のタスクが表示される)
'z' - カラー/単色 Off (カラー表示しない)
コマンドラインオプション
-b : バッチモード 操作 top を「バッチモード」で起動する。 top の出力を他のプログラムやファイルに送る場合に役立つ。このモードでは、top は入力を受け付けず、 '-n' コマンドラインオプションで設定された繰り返し回数に達するか、 kill されるまで実行を続ける。 -c : コマンドライン/プログラム名 トグル 最後に記録された 'c' の状態を逆にして、top を起動する。よって、top がコマンドラインを表示していた場合は、プログラム名を表示する。プログラム名を表示していた場合は、コマンドラインを表示する。より詳しい情報は対話的コマンド 'c' を参照すること。 -d : 遅延時間 間隔: -d ss.tt (秒.1/10秒) スクリーンを更新する間隔を指定する。ユーザー個人の設定ファイルにあるこれに対応する値、または起動時のデフォルトの値を上書きする。実行後に対話的コマンド 'd' または 's' で変更できる。 小数点以下の秒も指定できるが、負数は許可されない。しかし全ての場合において、 top が「セキュアモード」で実行されているときには、このような変更は禁止されている。ただし root の場合 (かつコマンドラインオプション 's' が使われていない場合) は除く。「セキュアモード」についてのより詳しい情報は、「5a. システム設定ファイル」の話題を参照すること。 -h : ヘルプ ライブラリのバージョンと使用法のプロンプトを表示して、終了する。 -i : アイドルプロセス トグル 最後に記録された 'i' の状態を逆にして、top を起動する。トグルが Off の場合、アイドルタスクまたはゾンビタスクは表示されない。 -n : 繰り返し回数 制限: -n number top が終了するまでの繰り返し回数またはフレームの最大数を指定する。 -u : ユーザーを指定して監視する: -u somebody 指定された実効 UID または実効ユーザー名にマッチするプロセスのみを監視する。 -U : ユーザーを指定して監視する: -U somebody 指定された UID またはユーザー名にマッチするプロセスのみを監視する。実・実効・保存・ファイルシステム UID とマッチするものが選ばれる。 -p : PID を指定して監視する: -pN1 -pN2 … または -pN1, N2 [,…] 指定されたプロセス ID とマッチするプロセスのみを監視する。このオプションを 20 個まで指定するか、コンマで区切った 20 個までのプロセス ID を指定することができる。両方を混ぜて使用することもできる。 これはコマンドラインオプションでのみ指定できる。通常の操作に戻したい場合は、top を終了して再起動する必要はなく -- 対話的コマンド '=' を実行するだけでよい。 -s : セキュアモード 操作 たとえ root であっても、強制的にセキュアモードにして top を起動する。このモードはシステムの設定ファイルで制御する方が、更に良い。 (「5. ファイル」の話題を参照すること)。 -S : 累積時間モード トグル 最後に記録された 'S' の状態を逆にして、top を起動する。「累積モード」が On の場合、各プロセスはそのプロセスとそのプロセスの終了した子プロセスで使われた cpu 時間とともに表示される。このモードのより詳しい情報については、対話的コマンド 'S' を参照すること。 -v : バージョン ライブラリのバージョンと使用法のプロンプトを表示して、終了する。
フィールド / カラム
表示可能なフィールドを以下にリストする。これらのフィールドは、対話的コマンド ‘o’ (フィールドの順序変更) で指定できる位置に関わらず、以下で示す文字と常に関連付けられている。
全てのフィールドはソート対象として選択可能であり、降順でソートするか昇順でソートするかを制御できる。ソート機能についての詳しい情報は「3c. タスクエリアコマンド」の話題を参照すること。
a: PID — プロセス ID
タスクの一意なプロセス ID。定期的に同じ番号が使われるが、0 から再スタートすることはない。
b: PPID — 親プロセスのプロセス ID
タスクの親タスクのプロセス ID。
c: RUSER — 実ユーザー名
タスクの所有者の実ユーザー名。
d: UID — ユーザー ID
タスクの所有者の実効ユーザー ID。
e: USER — ユーザー名
タスクの所有者の実効ユーザー名。
f: GROUP — グループ名
タスクの所有者の実効グループ名。
g: TTY — 制御端末
制御端末の名前。通常はプロセスが開始されたデバイス (シリアルポート、疑似端末 (pty) など) であり、入出力に使われる。しかしタスクは端末に関連付ける必要はなく、その場合は ‘?’ が表示される。
h: PR — 優先度
タスクの優先度
i: NI — nice 値
タスクの nice 値。負の nice 値は高い優先度を意味し、正の nice 値は低い優先度を意味する。このフィールドが 0 の場合、タスクの割り当て (dispatchability) を決定する際に優先度を調整していないこと意味する。
j: P — 最後に使用された CPU (SMP)
最後に利用されたプロセッサを表す値。カーネルはわざと weak affinity を使っているので、本当の SMP 環境では、この値は頻繁に変わりやすくなる。また実行中の top の動作そのものが (cpu 時間に対する余分な要求となることによって) weak affinity を壊すかもしれず、プロセスの CPU 変更がより多くなるかもしれない。
k: %CPU — CPU 使用率
前回のスクリーン更新からの、タスクの所要 CPU 時間の占有率。総 CPU 時間のパーセンテージで表される。本当の SMP 環境では、「Irix モード」が Off の場合、 top は「Solaris モード」で操作し、タスクの cpu 使用率は総 CPU 数で割り算される。 ‘Irix/Solaris’ モードは対話的コマンド ‘I’ でトグルできる。
l: TIME — CPU 時間
タスクが開始してから利用した CPU 時間の総計。「累積モード」が On の場合、各プロセスは終了した子プロセスが使った cpu 時間とともにリストされる。「累積モード」はコマンドラインオプションと対話的コマンドの ‘S’ でトグルできる。このモードについての更なる情報は、対話的コマンド ‘S’ を参照すること。
m: TIME+ — CPU 時間 (1/100 単位)
‘TIME’ と同じであるが、精度を 1/100 秒単位まで反映させる。
n: %MEM — メモリ使用率 (RES)
タスクが現在使用している利用可能な物理メモリの占有率。
o: VIRT — 仮想イメージ (kb)
タスクが使用している仮想メモリの総量。コード・データ・共有ライブラリ・スワップアウトされているページが含まれる。
VIRT = SWAP + RES.
p: SWAP — スワップされたサイズ (kb)
タスクの総仮想メモリイメージのうちスワップアウトされた部分。
q: RES — 常駐サイズ (kb)
タスクが使用しているスワップされていない物理メモリ。
RES = CODE + DATA.
TP 3 r: CODE — コードサイズ (kb) 実行可能コードに割かれる物理メモリの総量。「テキスト常駐サイズ (text resident set)」または TRS とも呼ばれる。
s: DATA — 「データ+スタック」のサイズ (kb)
実行可能コード以外に割かれる物理メモリの総量。「データ常駐サイズ (data resident set)」または DRS とも呼ばれる。
t: SHR — 共有メモリサイズ (kb)
タスクが利用している共有メモリの総量。他のプロセスと共有される可能性のあるメモリを単純に反映している。
u: nFLT — ページフォールト回数
あるタスクに対して起こったメジャーページフォールトの回数。ページフォールトは、現在、アドレス空間にない仮想ページに対してプロセスが読み書きしようとしたときに起こる。メジャーページフォールトとは、あるページを利用可能にするためにディスクアクセスが起こる場合のことである。
v: nDRT — ダーティページ数
最後に書き込まれてから変更されたページの数。ダーティページは、対応する物理メモリの場所が他の仮想ページで使用される前に、ディスクに書き込まれなければならない。
w: S — プロセス状態
タスクの状態は以下のいずれかである:
‘D’ = 割り込み不可能なスリープ状態
‘R’ = 実行中
‘S’ = スリープ状態
‘T’ = トレース中/停止された
‘Z’ = ゾンビ
実行中と表示されるタスクは「実行準備済み」と考えるのがより正しいだろう。 — タスクの task_struct は Linux の実行キューで表現されている。本当の SMP マシン以外でさえ、top の遅延間隔と nice 値に依っては、この状態のタスクを非常に多く目にするだろう。
x: Command — コマンドラインまたはプログラム名
タスクを開始するのに使ったコマンドライン、またはタスクに関連づけられたプログラムの名前を表示する。コマンドラインとプログラム名は、コマンドラインオプションと対話的コマンドの ‘c’ でトグルできる。
コマンドラインの表示を選択した場合、 (カーネルスレッドのように) コマンドラインのないプロセスは、以下の例のように、プログラム名だけが括弧で括られて表示される。
( mdrecoveryd )
コマンドライン・プログラム名の表示が現在のフィールド幅に対して長すぎる場合は、切り詰められる場合がある。フィールド幅はその他に選択されているフィールド・フィールドの順番・現在のスクリーン幅に依存する。
注意: ‘Command’ フィールド/カラムは固定幅でないという点が特殊である。表示の際、このカラムは残りの全てのスクリーン幅 (最大 512 文字) が割り当てられる。これは、プログラム名からコマンドラインへの切り替えで文字数が増える場合に備えるためである。
y: WCHAN — スリープしている関数
カーネルリンクマップ (‘System.map’) が利用可能かに否かによって、タスクが現在スリープしているカーネル関数の名前またはアドレスが表示される。実行中のタスクでは、このカラムにダッシュ (‘-‘) が表示される。
注意: このフィールドを表示すると、 top 自身のワーキングセットが 700Kb 増加する。このオーバーヘッドを減らす唯一の方法は、top を停止して再起動することである。
z: Flags — タスクフラグ
このカラムにはタスクの現在のスケジューリングフラグが 0 を省略した 16 進数で表示される。これらのフラグは公式には に書かれている。公式なものではないが、「フィールド選択」スクリーンと「フィールド順序指定」スクリーンにも説明がある。