1、Perf介绍 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫Performance counters的内核子系统实现,基于事件采样原理,以性能事件为基础,支持针对处理器相关
1、Perf介绍perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫“Performance counters“的内核子系统实现,基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,可用于性能瓶颈的查找与热点代码的定位。 Perf的主要功能和用途如下: 事件采样:Perf使用硬件性能计数器来采样事件,如CPU指令、缓存命中、缓存失效等,从而获取系统在运行时的性能数据。 调用图:Perf可以生成函数调用图,显示函数之间的调用关系和耗时,帮助识别程序的热点和性能瓶颈。 火焰图:火焰图是Perf输出的一种可视化图表,它可以直观地展示函数调用的耗时情况和函数的调用关系,以便快速准确地识别最频繁的代码路径,帮助快速定位性能瓶颈。 内存分析:Perf可以收集内存事件,如内存访问、缺页异常等,帮助识别内存性能问题。 锁分析:Perf可以监测锁的使用情况,帮助发现多线程程序中的竞争问题。 Tracing支持:Perf支持Linux Trace Toolkit Next Generation (LTTng)和eBPF等跟踪工具,用于深入分析系统的行为。 报告生成:Perf能够生成详细的报告和统计信息,方便用户理解和分析性能数据。 2、火焰图分类(1)CPU用途:检测导致CPU运行繁忙的原因。 (2)Memory Flame Graphs用途:检测应用程序内存使用量增加的原因。 (3)Off-CPU Flame Graphs用途:有些性能问题不是CPU的性能问题,即进程和线程不在CPU上运行时花费角度的时间,而是在程序请求期间花费了不少时间,这种情况也会成比例的影响性能。 (4)Hot/Cold Flame Graphs用途:将CPU和非CPU火焰图结合在一起。它在一个图表中显示了所有线程的运行时间,并允许直接比较在CPU和非CPU上的代码路径持续时间。 (5)Differential用途:红蓝差异火焰图,分析不同时刻CPU性能变化的原因。 3、火焰图安装命令(1)安装Perf工具
(2)下载可视化工具FlameGraph下载地址:GitHub - brendangregg/FlameGraph: Stack trace visualizer 4、火焰图demo测试测试程序如下:
程序编译命令:
(1)生成CPU火焰图1生成火焰图步骤如下: 程序运行结果如下:
使用浏览器打开perf.svg图,效果如下: (2)火焰图表解析上图中每个方块代表堆栈中的一个函数,也叫堆栈帧。 y轴:表示堆栈深度,火焰越高,表示函数调用层级越深,最顶部的方块表示当前CPU上运行的函数,每一块的函数下方都是当前函数的调用方。 x轴:表示当前函数的采样数,与大多数图表不同,它不显示从左到右的时间流逝。左到右的排序没有意义(它按字母顺序排序以最大程度地合并帧),方框的宽度显示了它在CPU上运行的总时间(基于采样计数)。哪个方块的宽度比较大,就表示该函数可能存在性能问题。 注意:图标中颜色不具有显著意义,通常是随机选择的暖色调。这种可视化称为"火焰图",因为它最初用于显示CPU上的热点,而且看起来像火焰。 它也是交互式的:将鼠标悬停在SVG上以显示详细信息,并单击进行缩放。 (3)当前程序图标分析从(1)中火焰图中看出,没有demo中定义的函数,这是因为printf函数占用改进程的CPU性能较高,而for循环逻辑占用性能较低,可以点击火焰图上的搜索按键Search进行搜索,本文搜索程序入口函数。 确定入口函数的步骤如下: a> 入口函数地址确定 输入下面命令
可执行文件信息如下: b> 获取对应地址入口函数 输入下面命令:
由上图可知入口函数为_start,所以搜索_start函数。 _start搜索结果如下: 点击__libc_start_main函数,进入对于函数调用过程,如下: (4)生成火焰图2将上面的代码中的#define DEF_PRINT 行进行屏蔽,这样函数就不会打印输出到屏幕上。重新编译代码,运行。 生成火焰图步骤跟上面(1)中一样,只是-p参数的进程ID号不同,生成的svg图片如下: 由svg图表可知,funcA在mainNoPrint进程中,占用该进程CPU 10%,funcB占用该进程CPU 20%,funcC占用该进程CPU 30%,funcD占用该进程CPU 40%。 (5)生成差分火焰图运行mainNoPrint函数,抓取系统所有进程的CPU,命令如下:
生成的火焰图如下: 停止mainNoPrint程序,抓取系统所有进程的CPU,命令如下:
生成的火焰图如下: 以perf.folded2的为基准,生成差分火焰图,命令如下:
生成的差分火焰图如下: 由红色部分图可知,CPU中funcD等函数占用的CPU增加了,蓝色部分相对于上次CPU减少了。 |
2024-04-02
2024-02-26
2023-01-24
2022-08-15
2021-06-25