Upgrade to Pro — share decks privately, control downloads, hide ads and more …

パフォーマンス分析のススメ

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 パフォーマンス分析のススメ

Avatar for akam1o

akam1o

March 07, 2026

More Decks by akam1o

Other Decks in Technology

Transcript

  1. パフォーマンス分析の目的 • システムやアプリケーションがどのようにコンピュータ資源 (CPU、メモリ、ディスク、ネットワークなど)を使っているか 測定・可視化・理解するため ◦ ボトルネックの特定 ◦ システムやアプリケーションの最適化 ◦

    スケーラビリティの評価 ◦ 運用や保守の安定化 ◦ コスト削減 • なぜ重要か? ◦ 限られたリソースで効率よく動かすには、どこを改善すべきか客観的 事実で判断する必要がある ◦ 勘や経験だけでは最適化ポイントを見誤る危険がある
  2. パフォーマンス分析のプロセス • 現状計測 → 問題点特定 → 改善案実施 → 再計測 •

    目的に合ったツールを選ぶ ◦ e.g. ボトルネックを知るために top を眺めているだけ では不十分 • 成功のためのポイント ◦ 数値や事実ベースでアプローチする重要性 ◦ 1回きりでなく「継続的」な計測・改善が大事 ◦ 開発段階・運用段階どちらでも有効
  3. パフォーマンス分析 まとめ • パフォーマンス分析はシステムの現状把握と最適化のために不 可欠 ◦ ボトルネックの特定 → 効率的な対策 →

    品質向上・安定運用 につながる ◦ 効率的な対策を打つためにも分析が必要 • 各種ツール(perf, strace, top, sar など)を目的に応じて活用する ◦ 現代だと prometheus などでメトリクスを集めることも大事 • 数値や事実に基づいて“継続的に”改善に取り組むことが大切 ◦ 勘や経験での改善が効果的であったかの測定にも有用
  4. strace の使い方 (1) • コマンドの実行をトレースできる ◦ strace CMD ◦ kernel

    がどのようなシステムコールを 実行しているのかわかる • さらに詳細のトレースができる ◦ strace -v CMD $ strace ls -l /tmp execve("/usr/bin/ls", ["ls", "-l", "/tmp"], 0x7fff240e0340 /* 27 vars */) = 0 brk(NULL) = 0x651f23c14000 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb3c58f8000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=61535, ...}) = 0 mmap(NULL, 61535, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb3c58e8000 close(3) = 0 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=174472, ...}) = 0 mmap(NULL, 181960, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb3c58bb000 mmap(0x7fb3c58c1000, 118784, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fb3c58c1000 mmap(0x7fb3c58de000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23000) = 0x7fb3c58de000 mmap(0x7fb3c58e4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x29000) = 0x7fb3c58e4000 mmap(0x7fb3c58e6000, 5832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb3c58e6000 close(3) = 0
  5. strace の使い方 (2) • 既に動作しているプロセスにアタッチできる ◦ strace -p PID ◦

    既存のプロセスが何をやっているかをトレースできる $ sudo strace -p 7938 strace: Process 7938 attached ppoll([{fd=4, events=POLLIN}, {fd=4, events=0}, {fd=11, events=POLLIN}, {fd=7, events=POLLIN}], 4, NULL, [], 8) = 1 ([{fd=11, revents=POLLIN}]) rt_sigprocmask(SIG_UNBLOCK, [CHLD], [CHLD], 8) = 0 read(11, "strace: Process 7938 attached\r\np"..., 32768) = 228 getrandom("\x44\x68\x6c\xac\x9d\x90\xa5\x7d\x08\x88", 10, 0) = 10 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 ppoll([{fd=4, events=POLLIN}, {fd=4, events=POLLOUT}, {fd=11, events=POLLIN}, {fd=7, events=POLLIN}], 4, NULL, [], 8) = 2 ([{fd=4, revents=POLLOUT}, {fd=11, revents=POLLIN}]) rt_sigprocmask(SIG_UNBLOCK, [CHLD], [CHLD], 8) = 0 read(11, "read(11, \"strace: Process 7938 a"..., 32768) = 405 write(4, ">O\300sT@\265[\24\274Q\336\225\232m\333j\376\222\2328:\343\251,\23`#\2523J\366"..., 268) = 268 getrandom("\xe5\x4f\xed\x03\xd0\x0a\x8f\xf5\xd1", 9, 0) = 9 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 ppoll([{fd=4, events=POLLIN}, {fd=4, events=POLLOUT}, {fd=11, events=POLLIN}, {fd=7, events=POLLIN}], 4, NULL, [], 8) = 2 ([{fd=4, revents=POLLOUT}, {fd=11, revents=POLLIN}]) rt_sigprocmask(SIG_UNBLOCK, [CHLD], [CHLD], 8) = 0 read(11, "read(11, \"read(11, \\\"strace: Pro"..., 32768) = 504 write(4, "m\36\274\202\321\246c\243\330\305t\333\376u\311B&,Z#\220\216]\366i\332\3244q\37\315\34"..., 444) = 444 getrandom("\xaf\x3c\x36\x18\xf6\x38", 6, 0) = 6 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
  6. strace の使い方 (3) • 特定のシステムコールに絞る ◦ strace -e SYSCALL CMD

    ◦ 特定の命令がどのくらいされたのか観測できる • 例: ◦ ls コマンドに対して openat が呼ばれたときを出力 $ strace -e openat ls openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3 +++ exited with 0 +++
  7. perf とは? • パフォーマンス計測ツールの1つ • システムやアプリケーションの挙動を 詳細に分析するためのツール • strace との違い

    ◦ 強力なパフォーマンスカウンタ機能 ◦ 解析・可視化 ▪ e.g. フレームグラフの作成 • その他のパフォーマンスツール ◦ top/htop ◦ vmstat/iostat/mpstat ◦ strace/ltrace ◦ blktrace/bpftrace
  8. よく使われる perf サブコマンド • perf stat ◦ パフォーマンスカウンタをまとめて表示する • perf

    record ◦ どの関数や命令に CPU 時間が消費されたかという詳細な プロファイルデータを記録 • perf report ◦ perf record で取得したデータを解析・可視化する • perf script/flamegraph ◦ perf データをテキストに変換/フレームグラフ化 • perf top ◦ top コマンドのようなインタフェースでプロファイルデータをリ アルタイム表示する
  9. perf stat • 指定したコマンドの実行中に、CPUサイクル数、命令数、 キャッシュミスなど、システム全体のパフォーマンスカウンタを まとめて計測して表示するコマンド ◦ perf stat CMD

    ◦ perf stat -p PID $ sudo perf stat -p 7938 ^C Performance counter stats for process id '7938': 0.08 msec task-clock # 0.000 CPUs utilized 1 context-switches # 12.120 K/sec 0 cpu-migrations # 0.000 /sec 0 page-faults # 0.000 /sec 78,543 cycles # 0.952 GHz 31,233 stalled-cycles-frontend # 39.77% frontend cycles idle 44,931 instructions # 0.57 insn per cycle # 0.70 stalled cycles per insn 9,590 branches # 116.228 M/sec 1,072 branch-misses # 11.18% of all branches 1.206650298 seconds time elapsed $ sudo perf stat ls Performance counter stats for 'ls': 1.81 msec task-clock # 0.643 CPUs utilized 0 context-switches # 0.000 /sec 0 cpu-migrations # 0.000 /sec 90 page-faults # 49.791 K/sec 2,586,280 cycles # 1.431 GHz 908,649 stalled-cycles-frontend # 35.13% frontend cycles idle 2,033,136 instructions # 0.79 insn per cycle # 0.45 stalled cycles per insn 419,010 branches # 231.812 M/sec 46,308 branch-misses # 11.05% of all branches 0.002813227 seconds time elapsed 0.000983000 seconds user 0.001967000 seconds sys
  10. perf record • システムの実行中に、どの関数や命令にCPU時間が消費さ れたかという詳細なプロファイルデータを記録する ◦ perf record -F 99

    -a --call-graph dwarf -o FILE -- sleep 30 ▪ -F 99: サンプリング頻度 1秒間に99回 ▪ -a: 全 CPU 上の全プロセスを対象 ▪ --call-graph dwarf: スタックトレースを DWARF デバッグ 情報を使って記録 ▪ -o FILE: 記録結果を FILE というファイル名で保存 • ファイル名を指定しない場合は perf.data ▪ --: ここ以降は実行コマンド指定 ▪ sleep 30: 30秒間記録させるために sleep 30 を実行
  11. perf report • perf record で取得したプロファイルデータを 解析・可視化するコマンド ◦ perf report

    -i FILE --call-graph=graph,5 (--stdio) (-C CPUID) ▪ --call-graph=graph,5: 5階層までの呼び出しグラフ ▪ --stdio: インタラクティブではなく標準出力にテキストで出力 ▪ -C CPUID: 特定のコアの perf のみを出力
  12. perf script • perf record で取得したプロファイルデータをテキスト形式に 変換するコマンド ◦ フレームグラフを作成する際には必須 ◦

    perf script -i FILE > out.txt $ perf script -i FILE perf 11529 [000] 167559.583061: 16 cycles:P: ffffffff8a3986cd [unknown] ([kernel.kallsyms]) ffffffff8a3a61b0 [unknown] ([kernel.kallsyms]) ffffffff8a3a657f [unknown] ([kernel.kallsyms]) ffffffff8a3a6698 [unknown] ([kernel.kallsyms]) ffffffff8a3a6cd6 [unknown] ([kernel.kallsyms]) ffffffff8a3a6f23 [unknown] ([kernel.kallsyms]) ffffffff8a39d20e [unknown] ([kernel.kallsyms]) ffffffff8a3993f7 [unknown] ([kernel.kallsyms]) ffffffff8a22db81 [unknown] ([kernel.kallsyms]) ffffffff8a22dd73 [unknown] ([kernel.kallsyms]) ffffffff8a39ddea [unknown] ([kernel.kallsyms]) ffffffff8a39def6 [unknown] ([kernel.kallsyms]) ffffffff8a3983b0 [unknown] ([kernel.kallsyms]) ffffffff8a3adc26 [unknown] ([kernel.kallsyms]) ffffffff8a3ae218 [unknown] ([kernel.kallsyms]) ffffffff8a50fc93 [unknown] ([kernel.kallsyms]) ffffffff8a006b63 [unknown] ([kernel.kallsyms]) ffffffff8b23e9ef [unknown] ([kernel.kallsyms]) ffffffff8b400130 [unknown] ([kernel.kallsyms]) 7c4a02124ded ioctl+0x3d (/usr/lib/x86_64-linux-gnu/libc.so.6) 6115abdad37a perf_evsel__ioctl+0x7a (/usr/lib/linux-tools-6.8.0-60/perf) 6115abdad3bb perf_evsel__run_ioctl+0x3e (/usr/lib/linux-tools-6.8.0-60/perf) 6115abdad41a perf_evsel__enable_cpu+0x2d (/usr/lib/linux-tools-6.8.0-60/perf) 6115abc830d1 __evlist__enable.constprop.0+0x111 (/usr/lib/linux-tools-6.8.0-60/perf) 6115abbc2463 __cmd_record.constprop.0+0x2803 (/usr/lib/linux-tools-6.8.0-60/perf)
  13. flamegraph • perf データをフレームグラフに変換できるツール ◦ https://github.com/brendangregg/Flamegraph $ git clone https://github.com/brendangregg/Flamegraph

    $ cd Flamegraph // Flamegraph 形式に変換 $ ./stackcollapse-perf.pl ../out.txt > ../out.folded // SVG 画像としてフレームグラフを生成 ./flamegraph.pl ../out.folded > ../flamegraph.svg
  14. bpftrace とは? • eBPF を利用して、kernel やアプリケーションの挙動をリアルタ イムにトレースできるツール • 利用シーン ◦

    パフォーマンスチューニング ▪ e.g. なぜこの処理が遅い? ◦ トラブル調査 ▪ e.g. 謎の I/O 遅延を解明したい ◦ セキュリティトラッキング ▪ e.g. • root 以外からの /etc/shadow アクセスを監視 • setuid/setgid を頻繁に変更するプロセスの検出
  15. bpftrace: eBPF とは? • Linux カーネル内で任意のプログラム安全・高速に動かすため の機構 • カーネルを再起動せずに動的な拡張・観測・制御が可能 •

    eBPFの使われている主な例 ◦ ネットワークパケットのフィルタリング・監視 ▪ kubernetes CNI Cilium ▪ Katran (Facebook の L4 SW LB) ◦ 性能モニタリング・トレーシング ◦ セキュリティ ▪ システムコール監視・Sandbox・攻撃検知 ◦ オブザーバビリティ(分散トレーシングとか) ◦ Linuxカーネルの新機能・強化 ◦ コンテナやクラウド基盤での高度な制御
  16. bpftrace: probe と action • probe: 観察したい「場所・イベント」を指定 ◦ 関数の入口や出口 ◦

    システムイベント • action: その時に実行する処理 • bpftrace スクリプトの基本構文 ◦ 構文は AWK に似ている ◦ probe {action} ▪ e.g. • kprobe:vfs_read { printf("read! pid=%d\n", pid); }
  17. bpftrace: 代表的な probe プローブ 例 主な用途 kprobe kprobe:vfs_read カーネル関数入口 kretprobe

    kretprobe:vfs_read カーネル関数出口 tracepoint tracepoint:syscalls:sys_enter_openat カーネルイベント uprobe uprobe:/bin/bash:main ユーザバイナリ関数入口 uretprobe uretprobe:/bin/bash:main ユーザバイナリ関数出口 software software:faults:1 ソフトウェアイベント hardware hardware:cache-misses:100000 ハードウェアイベント interval interval:s:5 一定間隔ごとに発動
  18. bpftrace: 代表的なビルドイン変数 変数 例 説明 pid 75919 プロセスID tid 75919

    スレッドID cpu 2 CPU ID uid 1000 ユーザーID comm sshd コマンド名 nsecs 699003134725209 カーネル起動からのナノ秒数 args /etc/hostname (args->filename) トレースポイント引数構造体
  19. bpftrace: 代表的なビルドイン変数 変数 例 説明 pid 75919 プロセスID tid 75919

    スレッドID cpu 2 CPU ID uid 1000 ユーザーID comm sshd コマンド名 nsecs 699003134725209 カーネル起動からのナノ秒数 args /etc/hostname (args->filename) トレースポイント引数構造体 対応するトレースポイント引数は -lv でトレースポイント指定することで確認できる (対応しているのは tracepoint probe のみ) # bpftrace -lv 'tracepoint:syscalls:sys_enter_openat' tracepoint:syscalls:sys_enter_openat int __syscall_nr int dfd const char * filename int flags umode_t mode
  20. • kprobe で vfs_read が呼ばれたときの comm, pid, tid • tracepoint

    で openat されたときの pid, filename bpftrace: 実行例 (1) $ sudo bpftrace -e 'kprobe:vfs_read { printf("comm=%s pid=%d tid=%d\n", comm, pid, tid); }' Attaching 1 probe... comm=sshd pid=75788 tid=75788 comm=sudo pid=77360 tid=77360 comm=sudo pid=77360 tid=77360 ^Ccomm=sudo pid=77360 tid=77360 $ sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("pid=%d filename=%s\n", pid, str(args->filename)); }' Attaching 1 probe... pid=77246 filename=/etc/ld.so.cache pid=77246 filename=/lib/x86_64-linux-gnu/libc.so.6 pid=77246 filename= pid=77246 filename=/etc/hostname
  21. • kprobe で cat のとき • / を使ったフィルタ構文でも書ける bpftrace: 実行例

    (2) $ sudo bpftrace -e 'kprobe:vfs_read / comm == "cat" / {printf("comm=%s pid=%d tid=%d\n", comm, pid, tid);}' Attaching 1 probe... comm=cat pid=77357 tid=77357 comm=cat pid=77357 tid=77357 comm=cat pid=77357 tid=77357 comm=cat pid=77357 tid=77357 comm=cat pid=77357 tid=77357 $ sudo bpftrace -e 'kprobe:vfs_read { if (comm == "cat") {printf("comm=%s pid=%d tid=%d\n", comm, pid, tid);}}' Attaching 1 probe... comm=cat pid=77387 tid=77387 comm=cat pid=77387 tid=77387 comm=cat pid=77387 tid=77387 comm=cat pid=77387 tid=77387
  22. bpftrace: マップ関数 (2) マップ関数 説明 avg 平均を計算 clear 値をクリア、マップのリセットに使う count

    カウント hist 対数ヒストグラム lhist 線形ヒストグラム stats count, avg, sum を呼び出し sum 合計を計算
  23. bpftrace: マップ関数の例 (1) • プロセス名ごとに vfs_read 回数をカウント ◦ bpftrace -e

    'kprobe:vfs_read {@[comm] = count();}' $ sudo bpftrace -e 'kprobe:vfs_read {@[comm] = count();}' Attaching 1 probe... ^C @[systemd-network]: 2 @[sudo]: 2 @[bash]: 5 @[cat]: 5 @[sshd]: 8
  24. bpftrace: マップ関数の例 (2) • プロセスIDxファイルディスクリプタごとに read 時のサイズを合 計 ◦ bpftrace

    -e 'kprobe:vfs_read {@[pid, arg0] = sum(arg2);}' $ sudo bpftrace -e 'kprobe:vfs_read {@[pid, arg0] = sum(arg2);}' Attaching 1 probe... ^C @[77793, -114411036765696]: 65536 @[77793, -114411036769536]: 65536 @[75872, -114410773869312]: 262144 @[75788, -114410665909504]: 262144
  25. bpftrace: マップ関数の例 (3) • read のバイト数の分布をヒストグラム化 ◦ bpftrace -e 'kprobe:vfs_read

    {@dist = hist(arg2);}' $ sudo bpftrace -e 'kprobe:vfs_read {@dist = hist(arg2);}' Attaching 1 probe... ^C @dist: [8, 16) 9 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [16, 32) 0 | | [32, 64) 0 | | [64, 128) 0 | | [128, 256) 0 | | [256, 512) 5 |@@@@@@@@@@@@@@@@@@@@ | [512, 1K) 13 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [1K, 2K) 6 |@@@@@@@@@@@@@@@@@@@@@@@@ | [2K, 4K) 0 | | [4K, 8K) 6 |@@@@@@@@@@@@@@@@@@@@@@@@ | [8K, 16K) 0 | | [16K, 32K) 5 |@@@@@@@@@@@@@@@@@@@@ | [32K, 64K) 0 | | [64K, 128K) 2 |@@@@@@@@ | [128K, 256K) 0 | | [256K, 512K) 5 |@@@@@@@@@@@@@@@@@@@@ |
  26. bpftrace: マップ関数の例 (4) • ページフォールトを10秒ごとにコマンド, pid 表示 ◦ (100 で

    1 count としている) ◦ bpftrace -e 'software:faults:100 { @[comm, pid] = count(); } interval:s:10 { print(@); clear(@); printf("---------------\n");}' $ sudo bpftrace -e 'software:faults:100 { @[comm, pid] = count(); } interval:s:10 { print(@); clear(@); printf("---------------\n");}' Attaching 2 probes... @[bash, 77894]: 1 @[bash, 75873]: 1 --------------- @[cat, 77903]: 1 @[bash, 77905]: 1 @[cat, 77901]: 1 @[cat, 77908]: 1 @[cat, 77898]: 1 @[bash, 77895]: 1 @[cat, 77904]: 1 @[bash, 77897]: 1 @[cat, 77907]: 1 @[cat, 77900]: 1 @[cat, 77902]: 1 @[cat, 77906]: 1 @[cat, 77899]: 1 @[bash, 75873]: 10 ---------------
  27. bpftrace: マップ関数の例 (5) • LLC(L3) キャッシュミスを10秒ごとにコマンド, pid 表示 ◦ (100k

    で 1 count としている) ◦ bpftrace -e 'hardware:cache-misses:100000 { @[comm, pid] = count(); } interval:s:10 { print(@); clear(@); printf("---------------\n"); }' $ sudo bpftrace -e 'hardware:cache-misses:100000 { @[comm, pid] = count(); } interval:s:10 { print(@); clear(@); printf("---------------\n"); }' Attaching 2 probes... @[rcuop/1, 29]: 1 @[swapper/1, 0]: 1 @[CPU 2/KVM, 12009]: 2 @[CPU 1/KVM, 12009]: 2 @[swapper/0, 0]: 38 --------------- @[CPU 3/KVM, 12009]: 1 @[swapper/5, 0]: 1 @[swapper/94, 0]: 1 @[CPU 2/KVM, 12009]: 1 @[CPU 0/KVM, 12009]: 1 @[ksmd, 724]: 1 @[swapper/35, 0]: 1 @[kworker/75:1, 69795]: 1 @[swapper/84, 0]: 1 @[swapper/0, 0]: 42 ---------------
  28. bpftrace: カリキュラム内のコマンドについて • bpftrace -e 'tracepoint:kvm:kvm_exit,tracepoint:kvm:kvm_entry { @[probe,comm,tid] = count();

    } interval:s:1 { print(@); clear(@); }' ◦ bpftrace -e ◦ 'tracepoint:kvm:kvm_exit,tracepoint:kvm:kvm_entry ▪ トレースポイントに kvm_exit, kvm_entry を指定 ◦ { @[probe,comm,tid] = count(); } ▪ probe(kvm_exit,kvm_entry), コマンド, スレッド ID でマッ プ ◦ interval:s:1 ▪ 1秒ごとに ◦ { print(@); clear(@); }' ▪ マップの内容を表示、マップをクリア
  29. bpftrace まとめ • bpftraceは強力な動的トレーシングツール ◦ シンプルなスクリプトでイベントを素早く取得・集計 • 主な特長 ◦ 豊富なプローブ(kprobe,

    tracepoint, software, hardware, interval など) ◦ ビルトイン変数&マップ(@[])で強力な集計・分析が可能 ◦ パフォーマンス解析・トラブルシュート・観察に活躍 • 基本の使い方 ◦ 「監視したいイベントにフック」→「マップで情報取得」 →「printfや集計で可視化」 ◦ わからないことがあったらマニュアルへ ▪ https://github.com/bpftrace/bpftrace/blob/master/man/ad oc/bpftrace.adoc
  30. EOP

  31. 参考資料 • Linux perf Examples ◦ https://www.brendangregg.com/perf.html • bpftrace(8) Manual

    Page ◦ https://github.com/bpftrace/bpftrace/blob/master/man/ado c/bpftrace.adoc