ツール分類の軸
Linux のパフォーマンスツールは2つの軸で分類できる。
| 軸 | 種類 | 説明 |
|---|
| 観測の種類 | 静的(Static) | 現在の状態スナップショット。オーバーヘッドが低い |
| 動的(Dynamic) | リアルタイムで変化を追う。詳細だがオーバーヘッドがある |
| 対象レイヤ | カーネル空間 | カーネル内部の処理を観測 |
| ユーザー空間 | アプリケーションの動作を観測 |
ツール全体マップ
ユーザー空間 カーネル空間
┌────────────────────────────────────────┐
静的 │ ps, lsof, free, df /proc, sysctl │
│ netstat, ss /sys, dmesg │
├────────────────────────────────────────┤
動的 │ strace, ltrace perf, Ftrace │
(計測) │ gdb, valgrind BPF/eBPF │
│ Java Flight Recorder kprobe, tracepoint│
└────────────────────────────────────────┘
↕ syscall 境界
ツール一覧と用途
システム全体の状態把握(最初に使うツール)
| ツール | 用途 | 使うタイミング |
|---|
uptime | 負荷平均(1/5/15分) | 初動の一発目 |
top / htop | CPU/メモリの上位プロセス | 犯人プロセスを大まかに絞る |
vmstat 1 | CPU・メモリ・スワップの時系列 | メモリ/スワップ状況の確認 |
dmesg | カーネルメッセージ | OOM・ハードウェアエラー確認 |
CPU 分析
| ツール | 用途 | 使うタイミング |
|---|
mpstat -P ALL 1 | コア別CPU使用率 | NUMA/マルチコア問題の確認 |
pidstat 1 | プロセス別CPU/I/O統計 | 犯人プロセスの特定 |
perf stat | CPU ハードウェアカウンタ | CPI・キャッシュミス率 |
perf record / report | CPU プロファイリング | どの関数がCPUを食っているか |
メモリ分析
| ツール | 用途 | 使うタイミング |
|---|
free -h | 全体メモリ使用量 | 初動確認 |
vmstat 1 | スワッピング発生状況 | si/so 列に注目 |
pmap -x <PID> | プロセスのメモリマップ | メモリセグメント分析 |
sar -B 1 | ページフォルト・ページング | ページキャッシュ効率 |
valgrind | メモリリーク検出 | 開発環境で |
memleak(BCC) | 本番でのメモリリーク | 本番での動的トレース |
ディスク・ファイルシステム
| ツール | 用途 | 使うタイミング |
|---|
iostat -xz 1 | ディスクI/O統計 | %util・await の確認 |
iotop | プロセス別I/O使用量 | ディスクを使っている犯人 |
df -h | ファイルシステム使用量 | ディスクフル確認 |
lsof | オープン中のファイル | FDリーク・ロックファイル |
opensnoop(BCC) | ファイルオープンの動的トレース | どのファイルを開いているか |
biolatency(BCC) | I/Oレイテンシ分布 | ディスク遅延の詳細 |
ネットワーク
| ツール | 用途 | 使うタイミング |
|---|
ss -tlnp | リッスンポート一覧 | サービス確認 |
ss -tnp | 確立済みTCP接続 | 接続状態の確認 |
sar -n DEV 1 | NIC送受信レート | 帯域使用率 |
sar -n TCP,ETCP 1 | TCP統計・リトランスミッション | パケットロスの検出 |
tcpdump | パケットキャプチャ | プロトコルレベルのデバッグ |
tcpconnect(BCC) | TCP接続の動的トレース | 接続先・ポートの確認 |
tcpretrans(BCC) | TCPリトランスの動的トレース | ネットワーク品質問題 |
/proc と /sys:カーネルの窓口
カーネル内部の情報はファイルシステム経由で読める。
# システム全体の CPU 統計(vmstat 等の元データ)
cat /proc/stat
# メモリの詳細
cat /proc/meminfo
# MemTotal, MemFree, MemAvailable, Buffers, Cached, SwapUsed 等
# 特定プロセスの情報
ls /proc/<PID>/
cat /proc/<PID>/status # 状態・メモリ使用量
cat /proc/<PID>/io # 読み書きバイト数
cat /proc/<PID>/net/dev # ネットワーク統計(プロセス単位)
cat /proc/<PID>/fd/ | wc -l # オープン中のファイルディスクリプタ数
# ネットワーク統計
cat /proc/net/tcp # TCP 接続一覧(ss の元データ)
cat /proc/net/dev # NIC 統計
# カーネルパラメータ(読み書き可能)
sysctl -a | grep tcp_rmem # TCP 受信バッファ
sysctl -a | grep vm.swappiness # スワップ積極度
動的トレーシングの仕組み
perf / Ftrace / BPF は動的にカーネルやアプリの動作を観測できる。仕組みを知ると使い方が分かる。
| 技術 | 仕組み | 代表ツール |
|---|
| tracepoint | カーネルコードに埋め込まれた静的フック | perf, bpftrace |
| kprobe | カーネル関数の任意の場所にフックを動的挿入 | perf probe, bpftrace |
| uprobe | ユーザー空間の関数に動的挿入 | perf probe, bpftrace |
| USDT | アプリに埋め込まれた静的フック(Node.js等) | bpftrace |
| PMC | CPU ハードウェアカウンタ(L1/L2 miss等) | perf stat |
# 利用可能な tracepoint 一覧
perf list tracepoint
# 利用可能な kprobe の確認
cat /sys/kernel/debug/tracing/available_filter_functions | grep tcp
# bpftrace で tracepoint の引数を確認
sudo bpftrace -lv tracepoint:syscalls:sys_enter_openat
ツール選択のデシジョンツリー
パフォーマンス問題が発生した
↓
1. まず全体を把握
→ uptime / top / vmstat / free / iostat / sar
↓ CPU が高い?
2a. CPU プロファイリング
→ mpstat → pidstat → perf record → フレームグラフ
↓ I/O が詰まっている?
2b. ディスク/ネットワーク分析
→ iostat → iotop → biolatency(BCC)
→ sar -n TCP → tcpretrans(BCC)
↓ メモリが足りない?
2c. メモリ分析
→ free → vmstat(si/so) → pmap → memleak(BCC)
↓ アプリ固有の問題?
2d. アプリレベルのトレース
→ strace → perf probe(uprobe) → bpftrace