本文主要记录如何使用perf分析性能瓶颈。
安装
centos
ubuntu
1
2
|
apt install -y linux-tools-generic
apt install -y linux-tools-`uname -r` || ln -fs /usr/lib/linux-tools/*-generic/perf /usr/bin/perf
|
火焰图支持
1
2
3
4
5
|
wget https://github.com/brendangregg/FlameGraph/archive/v1.0.tar.gz -O FlameGraph.gz
tar -xf FlameGraph.gz
cp FlameGraph-1.0/{flamegraph.pl,stackcollapse-perf.pl} /usr/bin/
rm -fr FlameGraph*
|
设置
有些配置项需要设置,否则非root用户无法达到最佳perf效果。
临时
1
2
|
sysctl -w kernel.kptr_restrict=0
sysctl -w kernel.perf_event_paranoid=-1
|
永久
修改 /etc/sysctl.conf
,设置相应值。
1
2
|
kernel.kptr_restrict=0
kernel.perf_event_paranoid=-1
|
使用
命令行
通过 perf record
可以搜集指定监控指标的数据,然后通过 perf report
查看结果。
其中 -e
选项指定监控指标,通过 perf list
查看完整列表。
-g
或者 --call-graph
选项启用记录调用关系。
另外可以通过 -p
选项指定监控的进程号,也可以直接运行程序。
1
2
3
4
5
6
7
8
9
10
11
|
# 实时分析
perf top -p 进程号
# 默认通过fp(frame pointer)获取调用关系,最好带-fno-omit-frame-pointer选项重编程序
perf record -a -e cpu-clock -g ./profiling ../moby.txt
# 通过dwarf获取调用关系(推荐)
perf record -a -e cpu-clock --call-graph dwarf ./profiling ../moby.txt
# 查看结果
perf report 或者 perf report --stdio
|
火焰图
perf report
的结果可能不是那么直观,可以生成火焰图查看。
1
2
3
4
|
# 对perf record搜集的数据再加工处理
perf script > perf.unfold
stackcollapse-perf.pl perf.unfold > perf.folded
flamegraph.pl perf.folded > perf.svg
|
生成的 perf.svg
用浏览器打开查看即可,越宽代表耗时越长,性能瓶颈的可能性越大。
示例代码
示例代码在 这里 ,可以实际操作体验。