使用perf和火焰图分析PostgreSQL数据库的性能瓶颈
Perf工具可用来对软件进行优化,包括算法优化(空间复杂度、时间复杂度)和代码优化(提高执行速度、减少内存占用)等等,perf 最常用的参数有top、stat、record,另外还有list和report等。
本文主要使用Perf的record,script以及FlameGraph工具生成火焰图,来进一步分析性能瓶颈和函数调用。
一、生成采样数据perf.data
使用perf record 采集数据,其中-g表示记录调用栈,-p 49383是进程号,即对哪个进程进行分析。采集后可以ctrl+c终止。
-e参数来统计需要关注的事件。 多个事件就用多个-e 连接。此处我带了cpu-clock,cpu-clock可以用来表示程序执行经过的真实时间,而无论CPU处于什么状态(Pn(n非0)或者是C状态)。
除了cpu-clock事件,比较常用的还有CPU cycle,CPU cycles用来表示执行程序指令花费的时钟周期数,如果CPU处于Pn(n非0)或者是C状态,则cycles的产生速度会减慢。
如果想查看哪些代码消耗的真实时间多,则可以使用cpu-clock事件;而如果想查看哪些代码消耗的时钟周期多,则可以使用CPU cycles事件。
除了此类cpu火焰图,也可以带上其他类型的事件进行统计,例如内存火焰图,分析内存的变化情况,可以进一步帮助分析内存被哪些模块占用、内存泄露问题的原因等问题。bio火焰图,统计io的耗时由哪些函数占用,便于分析优化io性能。此处不做赘述。
1 | perf record -e cpu-clock -g -p 49383 |
除此之外,常见的还可以带上如下选项:
-F 99:表示每秒99次
sleep 30:采集持续30秒,这样就不需要手动ctrl+c终止。
-o xxx:指定采集后输出的文件名等。
-t:指定线程TID。
-a:显示在所有CPU上的性能统计信息。
-C:显示在指定CPU上的性能统计信息。
第一步生成的perf.data文件其实也可以用perf report查看,只不过不直观
1 | perf report -n --stdio -i perf.data |
二、用perf script工具对perf.data进行解析
-i跟第一步收集的文件,进行解析
1 | perf script -i perf.data > perf.script |