Go 性能分析 · 2024年2月2日 0

性能分析工具perf & 火焰图使用指引【】

以下内容来自腾讯工程师 mason

导语 | perf 是一款 Linux 性能分析工具。本文旨在为使用该工具对特定的进程进行性能分析提供简单指引。并以一个实际案例辅助说明。

perf 工具使用三部曲

1. 找到对应进程id

使用 perf 对特定进程进行性能分析,首先需要找到该进程的进程id。以下面的4016端口的 mysqld 进程为例,该进程的进程id为:30944

 [root@TENCENT64 ~]# ps -ef | grep mysqld | grep 4016
tdsql    28463     1  0 15:00 ?        00:00:00 /bin/sh ./bin/mysqld_safe --defaults-file=/data/tdsql_run/4016/mysql-server-8.0.24/etc/my_4016.cnf --user=tdsql
tdsql    30944 28463 99 15:00 ?        02:56:33 /data/tdsql_run/4016/mysql-server-8.0.24/bin/mysqld --defaults-file=/data/tdsql_run/4016/mysql-server-8.0.24/etc/my_4016.cnf --basedir=/data/tdsql_run/4016/mysql-server-8.0.24 --datadir=/data1/tdengine/data/4016/dbdata_raw/data --plugin-dir=/data/tdsql_run/4016/mysql-server-8.0.24/lib/plugin --log-error=/data1/tdengine/log/4016/dblogs/mysqld.err --open-files-limit=100000 --pid-file=/data1/tdengine/data/4016/prod/mysql.pid --socket=/data1/tdengine/data/401/prod/mysql.sock --port=4016

2. 使用 perf 收集信息

使用 perf 收集信息,可以使用如下命令。

# -p 指定进程id
perf record -a -g -F99 -p 30944

# -a, --all-cpus        system-wide collection from all CPUs
# -g, --call-graph 
# -F, --freq         profile at this frequenc

运行一段时间后,按下 ctrl + c,在当前目录生成 perf.data 文件。

[root@TENCENT64 ~]# perf record -a -g -F99 -p 30944
Warning:
PID/TID switch overriding SYSTEM^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.428 MB perf.data (~18719 samples) ]

[root@TENCENT64 ~]# ls -l perf.data
-rw------- 1 root root 453124 Feb  9 14:27 perf.data
[root@TENCENT64 ~]# 

也可以通过添加参数 sleep 指定采集的时长(秒)。

perf record -a -g -F99 -p 30944 sleep 60

3. 生成火焰图

使用 perf script,将 perf.data 转换成可读的文本信息。

[root@TENCENT64 ~]# perf script > perf.script
[root@TENCENT64 ~]# ls -l perf.script 
-rw-r--r-- 1 root root 5703820 Feb  9 14:43 perf.script

使用FlameGraph生成火焰图。

# FlameGraph 解压在 /root/huayd/FlameGraph 目录下
[root@TENCENT64 ~]# ./huayd/FlameGraph/stackcollapse-perf.pl perf.script | ./huayd/FlameGraph/flamegraph.pl > report.svg

使用浏览器打开 report.svg 文件即可。

使用 perf 进行性能分析的案例

使用 sysbench 进行压测。

# tablenum=10
# table_size=1000000
# threadnum=200
# timerun=120
# 
# bindir=/data/tools/tdsql_testtools/sysbench/sysbench-master/src;
# luadir=/data/tools/tdsql_testtools/sysbench/sysbench-master/src/lua;
[root@tencent64 /data/tools/tdsql_testtools/sysbench/sysbench-master/src/lua]# ../sysbench oltp_read_write.lua --time=${timerun}  --threads=${threadnum}  --table-size=${table_size} --tables=${tablenum}  --forced-shutdown=off --report-interval=1 --events=0 --mysql-user=${user} --mysql-password="${pass}" --mysql-host=$host --mysql-port=$port --mysql-db=${db} run

200 并发,tps 在 1000 左右。(注意,该结果并非标准 oltp_read_write 场景,而是特别构造的读多写少的场景,在标准 oltp_read_write 的基础上增加了读的请求。)


在进行压测期间,使用 perf 收集性能数据。

[root@TENCENT64 ~]# perf record -a -g -F99 -p 30944
Warning:
PID/TID switch overriding SYSTEM^C[ perf record: Woken up 3 times to write data ]
[ perf record: Captured and wrote 24.668 MB perf.data (~1077751 samples) ]

[root@TENCENT64 ~]# 
[root@TENCENT64 ~]# perf script > perf.script
[root@TENCENT64 ~]# ./huayd/FlameGraph/stackcollapse-perf.pl perf.script | ./huayd/FlameGraph/flamegraph.pl > 4016_mysqld.svg
[root@TENCENT64 ~]# 

查看火焰图注意到,MVCC 读有比较明显的耗时,更进一步,不少时间花费在了构造 ReadView 上,我们知道,在 rc 隔离级别下,每一次的读请求,都需要构造一次 ReadView,以读取最新已 commit 的数据。



调整隔离级别为 rr 后进行压测,发现有 10% 左右的性能提升。


此时的火焰图上呈现 MVCC 读的耗时降下来了。


end

欢迎点赞分享,搜索关注【鹅厂架构师】公众号,一起探索更多业界领先产品技术。

文章来源于互联网:性能分析工具perf & 火焰图使用指引

打赏 赞(0) 分享'
分享到...
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏

文章目录