perf - arosh/arosh.github.com GitHub Wiki
https://valinux.hatenablog.com/entry/20201112
# --call-graph を付けると -g も有効になる
# -T はタイムスタンプなので FlameGraph 用途なら不要かも
OUT="$(date +'%Y%m%dT%H%M%S').perf"
sudo perf record -ag -F 99 -T -o "${OUT}" --call-graph dwarf -- sleep 10
sudo perf script -i "${OUT}" | ~/workspace/FlameGraph/stackcollapse-perf.pl | ~/workspace/FlameGraph/flamegraph.pl > "${OUT%.perf}.svg"
https://qiita.com/k0kubun/items/b094c4b9bd4fe0027a48
FlameGraph でメモリリークを可視化する
http://www.brendangregg.com/FlameGraphs/memoryflamegraphs.html
- bcc の stackcount で malloc などをトレースして stackcollapse.pl
- これだと malloc の回数しか分からないが mallocstacks を使うと確保したサイズも考慮してくれる
- 欠点としてはプログラムが4倍くらい遅くなる。それでも tcmalloc のトレース(6倍くらい遅くなる)よりは高速
- perf record で syscalls:sys_enter_brk をサンプリングするか、bcc の stackcount で brk システムコールをトレースする
- mmap をトレースする
- page-fault をトレースする。実際にメモリに書き込まれたタイミングを知ることができる
offcputime
https://github.com/iovisor/bcc/blob/master/INSTALL.md
# -d を付けるとフレームグラフでユーザー関数とカーネル関数の間に - というエントリが入る
# offcputime 自体が割り込みを引き起こすこともあるので --state=2 を付けて TASK_UNINTERRUPTIBLE のみ表示すると意味のあるグラフを作りやすい
sudo offcputime-bpfcc -u -f 10 > out.offcpustack
~/workspace/FlameGraph/flamegraph.pl --colors=io --countname=ns < out.offcpustack > offcpu.svg
- http://mysqlentomologist.blogspot.com/2021/05/off-cpu-analysis-attempt-to-find-reason.html
- http://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html
- http://www.brendangregg.com/offcpuanalysis.html
wakeuptime で待たせていた時間をもとにフレームグラフを描画したり、offwaketime で下から offcputime、上から wakeuptime を描画することができる。
0xtools
eBPF を使うのが難しい Linux 4.9 未満のカーネルでは offcputime の代わりに /proc を見る方法もある。
psn というツールの出力を加工して flamegraph.pl に入力することで Off-CPU Flame Graph が表示可能
- http://mysqlentomologist.blogspot.com/2021/01/linux-proc-filesystem-for-mysql-dbas_8.html
- http://mysqlentomologist.blogspot.com/2021/01/linux-proc-filesystem-for-mysql-dbas_16.html
以下にあるように perf でもサンプリングできるはずなのでこちらのほうが素直なやり方かも
http://www.brendangregg.com/blog/2015-02-26/linux-perf-off-cpu-flame-graph.html
カスタムカーネル対策
現在の Flatcar Container Linux の Stable で採用されている 5.10.77 に対応した perf を用意することを考える。
以下によると tools/perf を make & make install すればよいと書いてある。
https://gist.github.com/nidhi-ag/0eed632509a79ebc75218a8485a1ebe1
おそらくコンテナ側ではなくホスト側のカーネルに合わせる必要があるので、Ubuntu の mainline カーネルのことは気にしなくてよさそう。Flatcar が使っているカーネルを取ってくる必要がある。
パッチバージョンまで気にする必要が無いのであれば linux-oem-5.10 パッケージが使えるのかもしれない。
https://people.canonical.com/~kernel/info/kernel-version-map.html
真っ当にビルドするなら以下のような方法を使う必要がありそう。