🔭
概念 #システムパフォーマンス #Brendan Gregg #Linux #SRE #読書ノート #可観測性 📚 詳解 システム・パフォーマンス

詳解 システム・パフォーマンス - 第4章:可観測性ツール

Linuxパフォーマンスツールの全体マップ。静的/動的・カーネル/ユーザー空間の分類と、各ツールの用途・使い分け。

ツール分類の軸

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 / htopCPU/メモリの上位プロセス犯人プロセスを大まかに絞る
vmstat 1CPU・メモリ・スワップの時系列メモリ/スワップ状況の確認
dmesgカーネルメッセージOOM・ハードウェアエラー確認

CPU 分析

ツール用途使うタイミング
mpstat -P ALL 1コア別CPU使用率NUMA/マルチコア問題の確認
pidstat 1プロセス別CPU/I/O統計犯人プロセスの特定
perf statCPU ハードウェアカウンタCPI・キャッシュミス率
perf record / reportCPU プロファイリングどの関数が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 1NIC送受信レート帯域使用率
sar -n TCP,ETCP 1TCP統計・リトランスミッションパケットロスの検出
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
PMCCPU ハードウェアカウンタ(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

出典: 詳解 システム・パフォーマンス 第2版 Brendan Gregg著