【使用perf和火焰图分析PostgreSQL数据库的性能瓶颈】

news/2024/7/9 22:17:45 标签: 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性能。此处不做赘述。

  perf record -e cpu-clock -g -p 49383

除此之外,常见的还可以带上如下选项:

-F 99:表示每秒99次
sleep 30:采集持续30秒,这样就不需要手动ctrl+c终止。
-o xxx:指定采集后输出的文件名等。
-t:指定线程TID。
-a:显示在所有CPU上的性能统计信息。
-C:显示在指定CPU上的性能统计信息。

image.png

第一步生成的perf.data文件其实也可以用perf report查看,只不过不直观

perf report -n --stdio -i perf.data

image.png

二、用perf script工具对perf.data进行解析

-i跟第一步收集的文件,进行解析

perf script -i perf.data > perf.script

image.png

三、将perf.script中的符号进行折叠

使用FlameGraph的stackcollapse-perf.pl折叠调用栈

 ./stackcollapse-perf.pl perf.script > perf.folded

image.png

四、生成svg火焰图

使用FlameGraph的flamegraph.pl生成svg格式的火焰图

./flamegraph.pl perf.folded > perf.svg

五、查看火焰图

生成的火焰图大概是如下这样
 

image.png


其中每一个方框是一个函数,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。方框的长度,代表了它的执行时间,所以越宽的函数,就表示它被抽到的次数多,即执行的时间长。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

可以看到all上边的第一个就是postgres。如下的每个方框,即函数都可以点击,点击后,会显示其对应调用的子函数。例如点击XLogInsertRecord函数,可以显示出其调用的堆栈

image.png

点击hash_search_with_hash_value,显示它调用的堆栈。

image.png

火焰图主要看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题,可能是瓶颈。可以尝试对此类函数进行优化,从而提高性能。


http://www.niftyadmin.cn/n/4966009.html

相关文章

【RuoYi移动端】用storage实现本地存储

一、存储 // 引入本地存储工具方法import storage from /utils/storage // storage.set(键值名称, "值", 保存过期时间);storage.set(csj, "8384250", 86400);二、读取 storage.get(SYSTEM_INFO) storage.get(SYSTEM_INFO)

stm32之4.时钟体系

3.时钟体系(给单片机提供一个非常稳定的频率信号) ①可以使用三种不同的时钟源来驱动系统时钟(SYSCLK),CPU运行的频率为168MHZ; HSI(RC振荡器时钟,也就是高速内部时钟,一般来说很少用,因为精度…

238. 除自身以外数组的乘积 题解

题目描述:238. 除自身以外数组的乘积 - 力扣(LeetCode) 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元…

如何DIY制作干洗店洗护小程序

洗护行业正逐渐迎来线上化的浪潮,传统的干洗店也开始尝试将业务线上化,以提供更便捷的服务给消费者。而制作一款洗护小程序,成为了干洗店实现线上化的重要一环。今天,我们就来分享一下如何使用第三方制作平台制作洗护小程序的教程…

【C语言深度剖析】一、关键字

一、关键字分类 一般认为关键字有32个,这都是C90(C89)的标准,C99后边又增加了5个关键字,但由于目前的编译器对C99的支持并不好,所以后面默认使用C90,32个关键字; 1、补充代码 #inclu…

QT6安装完成后,再安装低版本的MinGW或其他组件方式

首先进入点击安装的uinstall Qt 并不是真的卸载 通过下面几步 1,首先登录自己账户 2,然后进入欢迎中,点击“添加和移除组件” 3,然后检索自己需要的安装内容

如何理解α、β一类错误和二类错误?

原假设 H0:一般是想要推翻的结论,如指标没有变化,实验组和对照组的该结果指标没有差异等。 备择假设 H1:一般是想要证明的结论,如实验组的指标是显著提升的,指标提升10%等。 弃真错误/一类错误/显著性水平…

【自然语言处理】关系抽取 —— DialogRE

Dialogue-Based Relation Extraction 论文信息 标题:Dialogue-Based Relation Extraction 作者:Dian Yu, Kai Sun, Claire Cardie, Dong Yu 期刊:ACL 2020 发布时间与更新时间:2020.04.17 主题:自然语言处理、关系抽取、对话场景、跨语句、DialogRE arXiv:[2004.08056] D…