背景
想要了解mysql某个功能或命令背后的具体原理,却因为不知道其对应的函数名,很难定位到相关源码。
使用火焰图:以定位alter table为例
1. 在服务器端使用perf采集数据
- 采集:
sudo perf record -F 99 -p $mysql_pid -g -- sleep 5
perf会统计mysql_pid对应的mysql实例在5秒内的函数调用情况,并在当前目录下生成perf.data文件,在这5秒内,在对应实例上执行alter table操作。
注意:为了让调用栈更加清晰,尽可能增大操作时间/采样时间的比值,比如对大表进行alter table操作以延长操作时间或减少采样时间等。
- 解析:
sudo perf script -i perf.data &> perf.unfold
,对采集数据进行解析
2. 将解析数据拉到本机,生成火焰图
- 使用httpfileserver下载解析数据
服务器安装httpfileserver,在对应目录下执行python -m SimpleHTTPServer
,本地浏览器打开ip:port,选择perf.unfold下载。
- 使用FlameGraph生成火焰图
https://github.com/brendangregg/FlameGraph,下载FlameGraph
执行命令:FlameGraph/stackcollapse-perf.pl perf.unfold | FlameGraph/flamegraph.pl > perf.svg
3. 使用浏览器打开svg文件
效果类似于:
这便能看到alter table操作的调用栈了。再通过函数名去gdb打断点,就能拿到很清晰的调用栈信息了。
拓展
- 火焰图最主要的用途还是分析程序性能,如某函数出现“平顶”调用情况,这函数很可能就是性能瓶颈。
- 不一定是msyql,其他大型项目定位具体函数时也可以用火焰图。