プロセス・リソース監視 — 50+ コマンドを 6 カテゴリで

「サーバが重い」「CPU が張り付いてる」「メモリ枯渇でプロセスが OOM Kill された」「ディスクが急に埋まった」―― この手の障害対応では toppslsofvmstatiostat が主役。 AWS の CloudWatch だけでは見えない「インスタンス内部で何が起きているか」を掴むのに必須です。

目次

  1. プロセス一覧 (ps / pgrep)
  2. リアルタイム監視 (top / htop / atop)
  3. プロセス制御 (kill / pkill / nice / renice)
  4. CPU / メモリ / I/O 統計 (vmstat / iostat / free / mpstat / sar)
  5. ファイルディスクリプタ・呼出し追跡 (lsof / strace / ltrace)
  6. ジョブ制御・バックグラウンド実行 (jobs / nohup / disown / screen / tmux)
  7. 障害対応レシピ
  8. 用語集

1. プロセス一覧 (ps / pgrep)

ps — プロセス一覧

BSD 形式 (ps aux) と System V 形式 (ps -ef) があります。現場でよく使うのは ps aux

引数意味
aux全ユーザの全プロセス + ターミナル無しも表示(BSD)
-ef全プロセスをフルフォーマット表示(System V)
-p PID特定 PID
-u USER特定ユーザ
--sort=-%cpuCPU 降順
--sort=-%memメモリ降順
-o FIELDS表示列カスタマイズ
-Lスレッドも表示
# 全プロセス
ps aux

# CPU 使用率トップ 10
ps aux --sort=-%cpu | head -n 11

# メモリ使用量トップ 10
ps aux --sort=-%mem | head -n 11

# 特定プロセス
ps -ef | grep nginx

# ツリー表示(親子関係)
ps auxf
ps -ejH

# カスタム列
ps -eo pid,ppid,user,%cpu,%mem,rss,etime,cmd --sort=-%mem | head

# 特定 PID の詳細
ps -p 1234 -o pid,ppid,user,%cpu,%mem,etime,cmd

# 特定ユーザのプロセス
ps -u www-data

pgrep / pidof — PID を検索

pgrep nginx                # nginx の PID 列挙
pgrep -u www-data          # 特定ユーザ
pgrep -f 'python app.py'   # コマンドラインも対象
pgrep -l nginx             # 名前付き
pgrep -a nginx             # コマンドライン全体表示
pidof sshd                 # 古典的な PID 取得

pstree — ツリー表示

pstree -p              # PID 付き
pstree -u              # ユーザ付き
pstree -p PID          # 特定 PID から下を表示

2. リアルタイム監視 (top / htop / atop)

top — 標準のプロセスモニタ

top
# 主要キー: P (CPU 順) / M (メモリ順) / T (時間順) / k (kill) / r (renice) / 1 (CPU 別)
# / で名前検索、u でユーザ絞り込み、c でフルコマンド表示
# H でスレッド表示

top -b -n 1 | head -n 20         # 1 回スナップショット (バッチモード、cron で取得)
top -p 1234,5678                 # 特定 PID
top -u www-data                  # ユーザ絞り込み
top -d 0.5                       # 0.5 秒ごと更新

htop — top の見やすい代替

htop
# F2 で設定、F4 でフィルタ、F5 でツリー、F6 でソートキー、F9 で kill
# Space でプロセス選択、c でツリーで折りたたみ
htop -u www-data
htop -p 1234,5678

atop — 過去ログを残せる

atop                              # リアルタイム(CPU/MEM/DSK/NET 全部)
atop -r /var/log/atop/atop_YYYYMMDD   # 過去ログ再生
atop -PCPU,DSK -r ...               # 特定リソースのみ
atop は atopd サービスで定期取得すると、後から「あの時何が起きてたか」を再生できる。 本番運用では入れておくと障害事後分析に強い。

3. プロセス制御 (kill / pkill / nice / renice)

kill — シグナル送信

シグナル番号意味
SIGTERM15正常終了要求(デフォルト)
SIGKILL9強制終了(プロセスが捕捉不可)
SIGINT2Ctrl+C 相当
SIGHUP1設定再読込(多くのデーモンが採用)
SIGUSR1/210/12アプリ独自
SIGSTOP/SIGCONT19/18一時停止/再開
kill 1234                   # SIGTERM 送信
kill -9 1234                # SIGKILL(最終手段)
kill -HUP 1234              # 設定再読込
kill -l                     # 全シグナル一覧

pkill nginx                 # 名前で送信
pkill -f 'python app.py'    # コマンドライン
pkill -u www-data           # ユーザ単位
pkill -9 -f 'stuck-process'

killall nginx               # 別実装、名前一致で送信

nice / renice — 優先度

nice -n 10 long-job             # nice 値 10 (低優先) で起動
renice -n 5 -p 1234             # 既存 PID の優先度変更
ionice -c 3 -p 1234             # I/O 優先度を idle に変更

timeout — 強制時間制限

timeout 30s ./long-script.sh    # 30 秒で SIGTERM
timeout -s KILL 30s cmd         # 30 秒で SIGKILL
timeout 30s sleep 60; echo $?   # 124 (timeout)

4. CPU / メモリ / I/O 統計

vmstat — システム統計

vmstat 1                      # 1 秒ごと
vmstat 1 5                    # 1 秒ごと 5 回
vmstat -SM 1                  # メモリ単位を MB に
vmstat -d                     # ディスク統計
vmstat -s                     # メモリ統計サマリ

# 主要カラム:
# r=実行待ち / b=ブロック中 / si=swap-in / so=swap-out / wa=I/O 待ち %CPU

iostat — I/O 統計

iostat -x 1                   # 拡張統計、1 秒ごと
iostat -dx 1                  # ディスクのみ
iostat -kx 1                  # KB 単位
iostat -p sda 1               # 特定デバイス

# 主要カラム:
# %util=デバイス使用率 / await=平均応答時間 ms / r/s, w/s=IOPS

free — メモリ

free -h                       # 人間可読
free -m                       # MB
free -s 2                     # 2 秒ごと連続表示

# available 列が「実際に使える空き」(バッファ/キャッシュ含めた近似値)

mpstat — CPU コアごと

mpstat -P ALL 1               # 全コア、1 秒ごと
mpstat -P ALL 1 5             # 5 回

sar — 過去〜現在の系列データ

# 必要パッケージ: sysstat (デフォルトで cron が定期収集)
sar -u                         # CPU 履歴
sar -r                         # メモリ履歴
sar -d                         # ディスク
sar -n DEV                     # ネットワーク
sar -A                         # 全リソース
sar -f /var/log/sa/sa10        # 10 日のログ再生

uptime — 負荷平均

uptime
# 例: 14:32:18 up 13 days, 3:17, 2 users, load average: 0.42, 0.51, 0.48
# 過去 1, 5, 15 分の load average
Linux の load average は「実行中 + I/O 待ち」を含むので、CPU コア数を超えても瞬時に「過負荷」とは限らない。 コア数で割って 1.0 を超えてれば確かに重い、1.0 未満なら通常運転。

5. ファイルディスクリプタ・呼出し追跡 (lsof / strace / ltrace)

lsof — 開いているファイル / ソケット

sudo lsof                          # 全プロセスの全 FD(重い)
sudo lsof -p 1234                  # 特定 PID
sudo lsof -i :443                  # 443 ポートを開いているプロセス
sudo lsof -i tcp                   # TCP 全ソケット
sudo lsof -u www-data              # 特定ユーザ
sudo lsof /var/log/app.log         # 特定ファイルを誰が掴んでいるか
sudo lsof +D /var/lib/docker       # ディレクトリ配下を再帰
sudo lsof +L1                      # unlink 済みだがプロセスが掴んでるファイル(ディスクが空かない犯人)

strace — システムコール追跡

sudo strace -p 1234                          # 既存プロセスにアタッチ
sudo strace -p 1234 -f -e trace=network      # 子プロセスも + ネットワーク系のみ
sudo strace -c ls                            # システムコールのサマリ統計
strace -e trace=open,openat ls               # 特定システムコールのみ
strace -o trace.log ./bin                    # ログ保存

ltrace — ライブラリ呼出し追跡

ltrace ./bin                 # 関数呼出しを追跡
ltrace -p 1234 -e malloc+free
strace は対象プロセスを大幅に遅くします(10 倍以上のことも)。本番で動作中サービスにアタッチするのは非常に注意。

6. ジョブ制御・バックグラウンド実行

# フォアグラウンドで動かしてる時 Ctrl+Z で停止
# bg で background へ、fg で foreground に戻る
jobs                              # 現在のジョブ一覧
fg %1                             # ジョブ 1 を foreground
bg %1                             # ジョブ 1 を background
disown %1                         # 親シェルから切り離す(exit 後も動かす)

# はじめからバックグラウンド
./long.sh &
nohup ./long.sh &                 # ハングアップ無視(terminal 切断後も継続)
nohup ./long.sh > out.log 2>&1 &

# screen / tmux で永続セッション
screen -S work                    # 起動 (Ctrl+A D で detach)
screen -r work                    # 再接続
tmux new -s work                  # 起動 (Ctrl+B D で detach)
tmux attach -t work               # 再接続
tmux ls                           # セッション一覧

障害対応レシピ

レシピ 1 — CPU が 100% 張り付いている犯人特定

top -b -n 1 | head -n 15                            # 全体スナップショット
ps aux --sort=-%cpu | head -n 5                     # CPU 上位
top -H -p $(pgrep -d, java)                         # スレッド単位
sudo strace -p <PID> -f -e trace=network -c        # システムコール集計

レシピ 2 — メモリ枯渇で OOM Killer が発動

dmesg -T | grep -i 'killed process'                 # 何が殺されたか
journalctl -k | grep -i oom
ps aux --sort=-%mem | head                          # 残ってる大食いプロセス
free -h
cat /proc/<PID>/status | grep -E 'VmRSS|VmSize'

レシピ 3 — ディスクが急に埋まった

df -h                                                # まずこれ
sudo du --max-depth=1 -h /var | sort -h             # 大きい配下
sudo find / -size +1G -type f 2>/dev/null
sudo lsof +L1                                        # unlink 済みファイルを掴んでるプロセス(再起動で解放)
journalctl --vacuum-size=200M                        # journald 切り詰め

レシピ 4 — プロセスが固まって kill -9 でも消えない

# Z (zombie): 親プロセスが wait してない → 親を再起動
ps -A -ostat,pid,ppid | awk '/^[Zz]/ { print }'
# D (uninterruptible sleep): I/O ブロック中、無理に殺せない → カーネル側 I/O 待ち調査
ps aux | awk '$8 ~ /D/'

レシピ 5 — ボトルネック切り分け(CPU / IO / Network)

vmstat 1 5         # r 大 → CPU 律速、b 大 → I/O 律速、wa 高 → I/O 待ち
iostat -x 1 5      # %util 高 / await 大 → ディスク律速
sar -n DEV 1 5     # rxkB/s, txkB/s で帯域使用率

コマンド早見表

# プロセス
ps aux --sort=-%mem | head
pgrep -af 'python app.py'
pstree -p

# モニタ
top / htop / atop -r LOG

# 制御
kill -TERM PID / kill -9 PID
pkill -f pattern
nohup ./cmd > out.log 2>&1 &

# 統計
vmstat 1 / iostat -x 1 / free -h
mpstat -P ALL 1 / sar -A

# 追跡
sudo lsof -p PID / sudo lsof -i :443 / sudo lsof +L1
sudo strace -p PID -f

用語集

PID / PPID
プロセス ID / 親プロセス ID。ps -efpstree -p で関係性を辿れる。
RSS (Resident Set Size)
プロセスが物理メモリに載せている量。ps の RSS 列、top の RES 列。
VSZ / VmSize
プロセスの仮想メモリサイズ。RSS より大きい。実際の物理使用量は RSS で見るのが正解。
nice / nice 値
プロセスのスケジューリング優先度。-20(高優先)〜 19(低優先)。nice/renice で変更。
シグナル (SIGTERM/SIGKILL/SIGHUP)
プロセスに送る OS の通知。SIGKILL のみプロセスは捕捉不可で確実に殺せる。
OOM Killer
Linux カーネルがメモリ枯渇時にスコアの高いプロセスを強制終了する仕組み。dmesgjournalctl -k で発動ログ確認。
load average
過去 1/5/15 分の「実行待ち + I/O 待ち」プロセスの平均数。CPU コア数で割ると負荷率の目安。
%util / await (iostat)
%util = デバイス利用率 / await = I/O 1 件あたりの平均応答時間 (ms)。両方高いとディスクボトルネック。
FD (File Descriptor)
プロセスが開いているファイル / ソケットの管理番号。OS / プロセスごとに上限 (ulimit -n)。
strace / ltrace
システムコール追跡 / ライブラリ呼出し追跡。原因不明のハング・遅延調査に使う。本番運用では負荷注意。
ジョブ制御
シェルが管理する fg/bg/jobs/disown の仕組み。nohupdisown でターミナル切断後も継続できる。
screen / tmux
仮想ターミナルセッション。SSH 切断しても作業継続、複数ペイン分割が可能。長時間ジョブには必須。
ゾンビプロセス (Z)
子プロセスが終了したのに親が wait していない状態。親プロセスが原因なので親を再起動。
uninterruptible sleep (D)
カーネル空間で I/O 完了待ち。Ctrl+C・SIGKILL でも止められない。NFS や故障ディスクで発生しがち。
sar / sysstat
過去のリソース統計を時系列で残すツール群。sysstat パッケージインストール後 cron で自動収集される。