top コマンドは、システムの CPU・メモリ使用状況やプロセス一覧をリアルタイムに表示するコマンドです。
「今どのプロセスが重いのか」「ロードアベレージと CPU 使用率がどうなっているか」を確認するときに、もっともよく使われる監視コマンドの一つです。
標準では、画面上部にシステム全体の情報(ロードアベレージ、タスク数、CPU 使用率、メモリ使用量など)、
画面下部にプロセスごとの CPU・メモリ使用率やコマンド名が表示されます。
インタラクティブに動作するため、表示中にキーを押してソート条件を切り替えたり、プロセスを kill したりすることもできます。
この記事では、コマンドラインオプションで制御する部分を中心に整理しつつ、
実務でよく使う top の使い方をまとめていきます。
top [オプション]
何も指定せずに top と入力すると、カレントユーザのプロセスも含めたシステム全体の状況がリアルタイム更新されます。
オプションを指定することで、監視対象ユーザを絞る、更新間隔を変える、特定 PID だけを見る、バッチモードで一度だけ出力するなどの制御が可能です。
なお、top 実行中に押すキー(P で CPU ソート、M でメモリソート、k で kill など)は、
ここでは詳しく触れず「画面内の対話操作」として扱います。
・top を起動してシステムの状況をリアルタイムに確認する(基本)
top
最も基本的な使い方です。
CPU 使用率が高いプロセスや、メモリを大量に消費しているプロセスを、その場で確認できます。
終了するときは q キーを押します。
・特定ユーザのプロセスだけを表示する(-u)
top -u apache
-u ユーザ名 を指定すると、そのユーザが所有しているプロセスだけを対象に表示します。
Web サーバユーザ(例:apache、www-data)やアプリユーザ単位で負荷を確認したいときに便利です。
・特定の PID のプロセスだけを監視する(-p)
top -p 1234
-p PID で、指定したプロセス ID だけを表示できます。
複数指定も可能で、top -p 1234 -p 5678 のように並べて指定します。
特定のバッチや、怪しいプロセスだけをピンポイントで追いかけたいときに役立ちます。
・更新間隔を 5 秒に変更する(-d)
top -d 5
-d 秒数 で、画面更新の間隔を指定します(デフォルトは環境によって異なりますが 3 秒前後のことが多いです)。
リアルタイム性を上げたい場合は短く、ログとして眺めたい場合は長めにして負荷を抑えることもできます。
・アイドルプロセスを表示せず「動いているもの」だけを見る(-i)
top -i
-i(idle プロセスの非表示)は、ほとんど CPU を使っていないプロセスを表示しないオプションです。
本当に CPU を消費しているプロセスだけに絞って見たいときに使います。
・スレッド単位で表示する(-H)
top -H
-H を指定すると、プロセスではなくスレッド単位で表示します。
マルチスレッドアプリケーションで、どのスレッドが CPU を消費しているか確認したい場合に有用です。
・コマンドライン全体を表示する(-c)
top -c
-c は、表示するコマンド名の形式を切り替えるオプションです。
デフォルトでは短いコマンド名のみが表示されますが、-c を付けるとコマンドライン全体が表示され、
どの引数で実行されているかが分かりやすくなります。
・バッチモードで 1 回だけ出力し、ログとして保存する(-b -n)
top -b -n 1 > /tmp/top_$(date +%Y%m%d%H%M%S).log
-b(batch モード)は、画面制御なしで機械処理しやすい形式で出力するモードです。
-n 回数 で更新回数を指定し、この例では 1 回だけ情報を取得して終了します。
cron や調査用に、一定間隔で top の出力をログとして残しておきたい場合によく使うパターンです。
・特定ユーザのプロセスだけを、バッチモードで 3 回取得する
top -b -n 3 -d 5 -u appuser > /tmp/top_appuser.log
5 秒間隔で 3 回、appuser のプロセスだけをバッチモードで取得する例です。
短時間の負荷変動をログとして残しておき、後から確認したい場合に使います。
・top 実行中にソート順を変更する(参考:対話操作)
top
top 実行中に、P キーで CPU 使用率順、M キーでメモリ使用量順にソートできます。
他にも、k でプロセスにシグナル送信、h でヘルプ表示など、対話的な操作が豊富です。
コマンドラインオプションと合わせて覚えておくと、top 単体でかなりのことができます。
・「サーバが重い」と言われたときのファーストチェック
まず top を叩いて、CPU・メモリ・ロードアベレージ・プロセス状況をざっと確認する、というのは典型的な流れです。
top → 必要に応じて ps や strace へ、という掘り下げの起点になります。
・特定アプリケーションユーザの負荷把握
top -u appuser のように、アプリケーション用ユーザに絞って表示することで、
「アプリがどれくらい CPU やメモリを使っているか」をざっくり把握できます。
・短時間の負荷状況をログとして残す
top -b -n 3 -d 10 のようにバッチモードで数回分を取得しておくと、
リアルタイムで画面を見ていなかった時間帯の負荷状況を後から追いかけることができます。
障害発生直後の状態を cron などで自動取得しておく設計も有効です。
・マルチスレッドアプリのスレッド負荷確認
top -H でスレッド単位表示に切り替えると、マルチスレッドアプリの「どのスレッドが重いか」が見えてきます。
Java アプリケーションなどでは、追加で jstack などと組み合わせて調査することも多いです。
top は「とりあえずの現状確認」にとても便利ですが、
一瞬の状態だけではなく、時間軸で追うことが大事です。
バッチモードやログ保存と組み合わせて、「発生時の状況」を残せるようにしておくと、後からの原因分析がぐっと楽になります。
| short option | long option | description |
|---|---|---|
| -d | --delay | 画面の更新間隔(秒)を指定する |
| -n | --iterations | 更新回数(反復回数)を指定し指定回数表示したら終了する |
| -b | --batch-mode | バッチモードで実行し画面制御なしのテキスト出力にする(スクリプトやログ取得向け) |
| -u | --user | 指定したユーザのプロセスだけを表示する |
| -p | --pid | 指定した PID のプロセスだけを表示する(複数指定可) |
| -i | --idle-processes | アイドル状態のプロセスを表示しない(実際に動いているプロセスに絞る) |
| -H | --threads | スレッド単位で表示する(マルチスレッドアプリの負荷確認向け) |
| -c | --command-line | コマンド名の代わりにコマンドライン全体を表示する |
| -S | --cumulative | 子プロセスを含めた累積 CPU 時間で表示する |
| -o | 指定したキー(ソートフィールド)で並び替えて表示する(対応していない top 実装もある) | |
| -h | --help | top コマンドの使い方(ヘルプ)を表示して終了する |
| -v | --version | top コマンドのバージョン情報を表示して終了する |
ここでは、Linux 環境で一般的によく使われる top コマンドのオプションを TablePress の表としてまとめている想定です。
実際に利用できるオプションや挙動は、ディストリビューションや top の実装によって異なる場合があるため、
本番環境で使用する前に man top や top -h で最新の仕様を確認してください。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
