「topコマンドを実行してみたけど、数字がたくさん並んでいて何を見ればいいのか分からない」
Linuxサーバーの運用で、こうした場面に遭遇したことはないでしょうか。
この記事では、Linuxの
top コマンドを使ってCPU使用率やメモリ使用量をリアルタイムに監視する実践的な手順を解説します。ヘッダー行(load average・タスク数・CPU%・メモリ/スワップ)の読み方から、操作キー、バッチモードでのスクリプト活用、さらにload averageが高い場合やCPUが100%に張り付いた場合のトラブルシュートまで、現場で必要な知識をまとめました。
topコマンドとは? サーバー監視の基本ツール
top は、Linuxに標準で入っているプロセス監視コマンドです。実行するとリアルタイムでCPU使用率・メモリ使用量・実行中のプロセス一覧が更新表示され、サーバーの「今の状態」をひと目で把握できます。障害対応やパフォーマンス調査の第一歩として、現場で最も使われるコマンドの一つです。
# topコマンドの実行(終了するにはqキーを押す) # top
topのヘッダー行の読み方
topの画面上部に表示される5行のヘッダーには、サーバーの状態を判断するために重要な情報が詰まっています。順番に見ていきましょう。1. load average(負荷平均)
1行目の右端に表示される3つの数値が load average です。top - 14:30:01 up 120 days, 3:15, 2 users, load average: 0.45, 0.60, 0.72
この数値はCPUコア数と比較して判断します。例えば4コアのサーバーなら、load averageが4.0前後で「CPUがフル稼働」の状態です。コア数を超えた値が続いている場合は、処理待ちが発生しています。
# CPUコア数の確認方法 # nproc 4
2. タスク(プロセス数)
2行目には、システム上のプロセスの総数と状態別の内訳が表示されます。Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
・sleeping:待機中(入出力待ちなど)のプロセス数
・stopped:停止中のプロセス数
・zombie:終了処理が完了していないゾンビプロセス数
zombieが増え続けている場合は、親プロセスに問題がある可能性があります。
3. CPU使用率(%Cpu(s)行)
3行目はCPUの使用内訳です。%Cpu(s): 5.2 us, 1.3 sy, 0.0 ni, 92.8 id, 0.5 wa, 0.0 hi, 0.2 si, 0.0 st
・sy(system):カーネル(OS)のCPU使用率
・ni(nice):nice値で優先度を変更したプロセスのCPU使用率
・id(idle):アイドル(空き)の割合。この値が低いほどCPUが忙しい
・wa(iowait):ディスクI/O待ちの割合。高い場合はディスクがボトルネック
・hi(hardware interrupt):ハードウェア割り込みの使用率
・si(software interrupt):ソフトウェア割り込みの使用率
・st(steal):仮想マシン環境でホスト側に奪われたCPU時間
実務で特に注目すべきは id(空き)と wa(I/O待ち)です。idが極端に低ければCPU不足、waが高ければディスク性能がボトルネックと判断できます。
4. メモリ使用量(MiB Mem行)
4行目は物理メモリの使用状況です。MiB Mem : 7953.5 total, 512.3 free, 3200.8 used, 4240.4 buff/cache
・free:未使用のメモリ
・used:プロセスが使用しているメモリ
・buff/cache:バッファ/キャッシュとして使われているメモリ
ここで重要なのは、freeが少なくても、すぐにメモリ不足とは限らないということです。Linuxは空きメモリをファイルのキャッシュに積極的に使います。buff/cacheは必要に応じてすぐに解放されるため、「free + buff/cache」が実質的に利用可能なメモリと考えてください。
5. スワップ使用量(MiB Swap行)
5行目はスワップ(ディスク上の仮想メモリ領域)の使用状況です。MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4500.2 avail Mem
topの操作キー一覧
topは実行中にキーボードで操作を切り替えられます。覚えておくと作業効率が上がるキーをまとめます。・q:topを終了する
・P(Shift+p):CPU使用率の高い順にソート(デフォルト)
・M(Shift+m):メモリ使用量の高い順にソート
・1(数字の1):CPUコアごとの使用率を個別表示する
・c:プロセスのコマンドライン全体を表示する(引数やパスも見られる)
・k:指定したPIDのプロセスにシグナルを送る(kill)
・d:更新間隔(秒)を変更する
・Shift+w:現在の表示設定を ~/.toprc に保存する
特に 1キー と cキー は実務で頻繁に使います。1キーでコア別の偏りが分かり、cキーで「どのプログラムのどんな処理か」を特定できます。
topコマンドの主要オプション
1. 更新間隔を指定する(-d)
デフォルトでは3秒ごとに画面が更新されますが、-d オプションで変更できます。# 5秒間隔で更新する # top -d 5
2. 更新回数を指定して自動終了する(-n)
-n オプションで、指定した回数だけ更新したら自動的に終了させられます。# 3回更新したら自動終了 # top -n 3
3. 特定のプロセスだけ監視する(-p)
PID(プロセスID)を指定して、そのプロセスだけを表示できます。特定のサービスを監視したい場合に便利です。# PID 1234 のプロセスだけ監視する # top -p 1234
4. 特定ユーザーのプロセスだけ表示する(-u)
-u オプションで、指定したユーザーが実行しているプロセスだけに絞り込めます。共用サーバーで「誰のプロセスがCPUを使っているのか」を調べる場面で重宝します。# apache ユーザーのプロセスだけ表示する # top -u apache
5. バッチモードで出力する(-b)
-b(batch)オプションを使うと、topの出力を対話的な画面ではなくテキストとして出力します。ログファイルに保存したり、スクリプトから呼び出す場合に使います。# バッチモードで1回だけ出力し、ファイルに保存する # top -b -n 1 > /tmp/top_output.txt
実務で役立つtopの活用テクニック
1. CPU使用率が高いプロセスを特定する手順
「サーバーが重い」と連絡を受けたときの基本的な調査手順です。(1)
top を実行して load average とCPU使用率を確認する(2)
P キー(デフォルト)でCPU使用率の高い順に並べる(3) 上位に張り付いているプロセスのPIDとCOMMAND列を確認する
(4)
c キーでコマンドラインの詳細を表示し、何の処理かを特定する2. メモリを大量消費しているプロセスを探す
メモリ不足が疑われる場合は、以下の手順で調べます。(1)
top を実行する(2)
M キーでメモリ使用量順にソートする(3) RES列(実際に使っている物理メモリ量)に注目する
RES列の値が極端に大きいプロセスがあれば、そのプロセスがメモリを消費している原因です。
3. バッチモードで定期的に記録する(cron連携)
障害発生時に「その時の状態」を振り返るためには、topの出力を定期的にファイルへ保存しておくのが有効です。# crontabに以下を追加(5分ごとにtopの出力を記録する例) */5 * * * * top -b -n 1 >> /var/log/top_history.log 2>&1
load averageが高い場合の切り分け方法
load averageがCPUコア数を超えている場合、原因は大きく2つに分かれます。1. CPU負荷が高い場合(us + sy が高い)
topのCPU行で us(ユーザープロセス)や sy(カーネル処理)が高い場合、特定のプロセスがCPUを消費しています。(1)
P キーでCPU順にソートし、原因プロセスを特定する(2)
c キーでコマンド詳細を確認する(3) 必要に応じて
kill コマンドやサービスの再起動で対処する# PID 5678 のプロセスを終了する # kill 5678 # 強制終了する場合(通常のkillで止まらない場合のみ) # kill -9 5678
2. I/O待ちが高い場合(wa が高い)
topのCPU行で wa(iowait)が高い場合、ディスクI/Oがボトルネックです。CPUは実は暇で、ディスクの読み書きを待っている状態です。(1)
iostat コマンドでディスクごとのI/O状況を確認する(2)
iotop コマンドでどのプロセスがI/Oを発生させているか特定する# ディスクI/Oの状況を確認する(sysstatパッケージが必要) # iostat -x 1 3 # プロセス別のI/O使用状況を確認する # iotop
topでCPUが100%に張り付いた場合の対処
特定のプロセスがCPU 100%を使い続けている場合の対処手順です。1. 原因プロセスの特定
# topを実行し、CPU使用率でソート(デフォルト) # top # %CPU列が100%近いプロセスのPIDとCOMMANDを確認する # cキーでフルコマンドラインを表示
2. プロセスの詳細確認
topで特定したPIDについて、さらに詳しく調べます。# プロセスの詳細情報を確認する # ps aux | grep PID番号 # プロセスが開いているファイルを確認する # ls -l /proc/PID番号/fd/
3. 対処の判断
・Webサーバー(httpd/nginx)の場合 → アクセスログを確認し、異常なアクセスがないか調べる・バッチ処理の場合 → 処理が無限ループに陥っていないか、ログを確認する
・原因不明の場合 →
strace -p PID番号 でプロセスのシステムコールを追跡して調査する【重要】killする前の注意点
障害対応で焦ってプロセスを強制終了(kill -9)する前に、必ず以下を確認してください。・そのプロセスを止めてもサービスに影響がないか
・データベース関連のプロセスの場合、データ破損のリスクがないか
・まず
kill PID番号(SIGTERMシグナル)で正常終了を試み、応答がない場合にのみ kill -9 を使うOOM Killer ~ メモリ不足でプロセスが強制終了される仕組み~
Linuxには、物理メモリとスワップの両方を使い切った場合に、カーネルが自動的にプロセスを強制終了する OOM Killer(Out Of Memory Killer)という仕組みがあります。OOM Killerが発動すると、メモリを最も多く消費しているプロセスが選ばれて強制停止されます。本番サーバーでこれが発生すると、Webサーバーやデータベースが突然落ちるため、大きな障害につながります。
# OOM Killerが発動したかどうかをログで確認する # grep -i "oom" /var/log/messages # または # dmesg | grep -i "oom"
htopとの比較 ~ より見やすい代替ツール~
htop は、topの機能を強化した対話型プロセスビューアです。標準ではインストールされていませんが、視覚的に分かりやすいため多くの管理者が愛用しています。| 項目 | top | htop |
|---|---|---|
| 標準インストール | あり(全ディストリビューション) | なし(別途インストール) |
| 操作性 | キーボードショートカット中心 | マウス操作対応、カラー表示 |
| CPU表示 | 1キーでコア別切り替え | 常にコア別バーグラフ表示 |
| プロセスツリー | 非対応 | F5キーでツリー表示 |
| スクリプト利用 | -bオプションで対応 | バッチモードなし |
# htopのインストール(RHEL/CentOS/AlmaLinux) # yum install epel-release # yum install htop # htopのインストール(Ubuntu/Debian) # apt install htop
本記事のまとめ
| やりたいこと | コマンド / 操作 |
|---|---|
| リアルタイムでプロセスを監視する | top |
| 更新間隔を変更する | top -d 秒数 |
| 指定回数で自動終了する | top -n 回数 |
| 特定プロセスだけ監視する | top -p PID番号 |
| 特定ユーザーのプロセスだけ表示する | top -u ユーザー名 |
| バッチモードでファイルに保存する | top -b -n 1 > ファイル名 |
| CPU使用率順にソートする | top実行中に P キー |
| メモリ使用量順にソートする | top実行中に M キー |
| CPUコアごとの使用率を表示する | top実行中に 1 キー |
| コマンドライン全体を表示する | top実行中に c キー |
| CPUコア数を確認する | nproc |
| OOM Killerの発動を確認する | grep -i "oom" /var/log/messages |
topコマンドの見方が分かったら、次はサーバー構築の「型」を身につけませんか?
topでプロセスやCPU使用率を確認できるようになったら、次のステップはサーバーの構築・運用を体系的に学ぶことです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
