linux下性能分析工具Perf安装与用法

目录

1、Perf介绍

2、火焰图分类

 (1)CPU

 (2)Memory Flame Graphs

 (3)Off-CPU Flame Graphs

 (4)Hot/Cold Flame Graphs

 (5)Differential

 3、火焰图安装命令

(1)安装Perf工具

(2)下载可视化工具FlameGraph

 4、火焰图demo测试

(1)生成CPU火焰图1

(2)火焰图表解析

(3)当前程序图标分析

a> 入口函数地址确定

b> 获取对应地址入口函数

 (4)生成火焰图2

 (5)生成差分火焰图


1、Perf介绍

perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫“Performance counters“的内核子系统实现,基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,可用于性能瓶颈的查找与热点代码的定位。

Perf的主要功能和用途如下:

  1. 事件采样:Perf使用硬件性能计数器来采样事件,如CPU指令、缓存命中、缓存失效等,从而获取系统在运行时的性能数据。

  2. 调用图:Perf可以生成函数调用图,显示函数之间的调用关系和耗时,帮助识别程序的热点和性能瓶颈。

  3. 火焰图:火焰图是Perf输出的一种可视化图表,它可以直观地展示函数调用的耗时情况和函数的调用关系,以便快速准确地识别最频繁的代码路径,帮助快速定位性能瓶颈。

  4. 内存分析:Perf可以收集内存事件,如内存访问、缺页异常等,帮助识别内存性能问题。

  5. 锁分析:Perf可以监测锁的使用情况,帮助发现多线程程序中的竞争问题。

  6. Tracing支持:Perf支持Linux Trace Toolkit Next Generation (LTTng)和eBPF等跟踪工具,用于深入分析系统的行为。

  7. 报告生成: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工具

$ sudo apt-get install linux-tools-$(uname -r) linux-tools-generic -y    //下载Perf
$ perf -v    //查看安装Perf的版本

(2)下载可视化工具FlameGraph

下载地址:GitHub - brendangregg/FlameGraph: Stack trace visualizer

 4、火焰图demo测试

测试程序如下:

#include <stdio.h>
#define DEF_PRINT    void funcA()
{for(int i=0; i < 10*10000;i++){
#ifdef DEF_PRINTprintf("funcA\n");
#endif}
}void funcB()
{for(int i=0; i < 20*10000;i++){
#ifdef DEF_PRINTprintf("funcB\n");
#endif}
}void funcC()
{for(int i=0; i < 30*10000;i++){
#ifdef DEF_PRINTprintf("funcC\n");
#endif}
}void printf1();
void printf2();
void funcD()
{for(int i=0; i < 20*10000;i++){
#ifdef DEF_PRINTprintf("funcD\n");
#endif}printf1();
}void printf1()
{for(int i=0; i < 10*10000;i++){
#ifdef DEF_PRINTprintf("printf1\n");
#endif}printf2();
}void printf2()
{for(int i=0; i < 10*10000;i++){
#ifdef DEF_PRINTprintf("printf2\n");
#endif}
}int main()
{while (true) {funcA();funcB();funcC();funcD();}return 0;
}

 程序编译命令:

g++ -g -O0 main.cpp -o main

(1)生成CPU火焰图1

生成火焰图步骤如下:

程序运行结果如下:

//上面main程序运行时,使用top查看,进程PID为5606,CPU为86.3%左右。$ sudo perf record -F 99 -p 5606 -g -- sleep 30
//-F 99 表示每秒99次采样, -p 5606 是进程号, 即对哪个进程进行分析, -g 表示记录调用栈, sleep 30 则是持续30秒。$ sudo perf script -i perf.data &>perf.unfold
//perf script 工具对 perf.data 进行解析,生成折叠后的调用栈。$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded
//下载的可视化工具FlameGraph在当前文件上一层,用 stackcollapse-perf.pl 将 perf 解析出的内容 perf.unfold 中的符号进行折叠。$ ../FlameGraph/flamegraph.pl perf.folded >perf1.svg
//生成svg图

使用浏览器打开perf.svg图,效果如下:

(2)火焰图表解析

 上图中每个方块代表堆栈中的一个函数,也叫堆栈帧。

y轴:表示堆栈深度,火焰越高,表示函数调用层级越深,最顶部的方块表示当前CPU上运行的函数,每一块的函数下方都是当前函数的调用方。

x轴:表示当前函数的采样数,与大多数图表不同,它不显示从左到右的时间流逝。左到右的排序没有意义(它按字母顺序排序以最大程度地合并帧),方框的宽度显示了它在CPU上运行的总时间(基于采样计数)。哪个方块的宽度比较大,就表示该函数可能存在性能问题。

注意:图标中颜色不具有显著意义,通常是随机选择的暖色调。这种可视化称为"火焰图",因为它最初用于显示CPU上的热点,而且看起来像火焰。

它也是交互式的:将鼠标悬停在SVG上以显示详细信息,并单击进行缩放。

(3)当前程序图标分析

从(1)中火焰图中看出,没有demo中定义的函数,这是因为printf函数占用改进程的CPU性能较高,而for循环逻辑占用性能较低,可以点击火焰图上的搜索按键Search进行搜索,本文搜索程序入口函数。

确定入口函数的步骤如下:

a> 入口函数地址确定

输入下面命令

$ readelf -h main

可执行文件信息如下: 

b> 获取对应地址入口函数

输入下面命令:

$ readelf -s main

 由上图可知入口函数为_start,所以搜索_start函数。

_start搜索结果如下:

点击__libc_start_main函数,进入对于函数调用过程,如下:

上面火焰图中printf函数占用该进程CPU性能较高,printf的函数输出内容到显示的过程可参考下面链接:

printf函数打印(一)—— 过程解析篇_printf调用过程_仲夏夜之梦~的博客-CSDN博客

printf函数打印(二)—— 缓冲区篇(文件读写再探究)_printf flush_仲夏夜之梦~的博客-CSDN博客

 (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,命令如下:

$ sudo perf record -F 99 -a -g -- sleep 30     //a表示对所有进程堆栈数据进行抓取
$ sudo perf script -i perf.data &>perf.unfold
$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded1
$ ../FlameGraph/flamegraph.pl perf.folded1 >perf1.svg

 生成的火焰图如下:

 停止mainNoPrint程序,抓取系统所有进程的CPU,命令如下:

$ sudo perf record -F 99 -a -g -- sleep 30
$ sudo perf script -i perf.data &>perf.unfold
$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded2
$ ../FlameGraph/flamegraph.pl perf.folded2 >perf2.svg

生成的火焰图如下:

以perf.folded2的为基准,生成差分火焰图,命令如下:

$./FlameGraph/difffolded.pl perf.folded2 perf.folded1|../FlameGraph/flamegraph.pl >diff1.svg

 生成的差分火焰图如下:

 由红色部分图可知,CPU中funcD等函数占用的CPU增加了,蓝色部分相对于上次CPU减少了。

附加:

1、火焰图的介绍也可参考:

 Linux下用火焰图进行性能分析_perf火焰图分析_CHENG Jian的博客-CSDN博客

 2、可视化工具官方可参考:Flame Graphs (brendangregg.com)

 3、其他性能分析工具可参考:C++ performance 性能分析工具(sanitizers valgrind gprof gperftools perf)的使用_performance测试工具_超级大洋葱806的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/75394.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu安装harbor(http模式)并随便上传一个

Ubuntu安装harbor&#xff08;http模式&#xff09; docker和harbor的介绍就免了&#xff0c;都不知道啥东西&#xff0c;还安装搞毛 先安装docker环境 不要问&#xff0c;软件源之类的配置&#xff0c;挨个梭就行 sudo apt update sudo apt install apt-transport-https ca…

uniapp 路由跳转方式

export function goBack(index, url) {if (index 1) { // 关闭当前页&#xff0c;返回上一页面或多级页面。uni.navigateBack({delta: url,animationType: pop-out,animationDuration: 300});} else if (index 2) { // 保留当前页&#xff0c;跳转到非tabbar页面&#xff0c;…

不规则文件转JSON

需求分析&#xff1a; 有时候&#xff0c;我们取出来的数据并不是一个规则的JSON文件&#xff0c;这个时候面对存库还是ES检索都是一个问题&#xff0c;所以我们就需要进行解析&#xff0c;然而用字符串分割是不现实的&#xff0c;我们需要一种快速的方法。 问题解决&#x…

C++ ------ 类和对象的深究

文章目录 构造函数初始化列表概念特性 explicit关键字 static成员概念特点 友元友元函数友元类概念特性 内部类概念特点 匿名对象拷贝对象时的一些编译器优化 构造函数 我们来看下面的代码&#xff1a; #include <iostream> using namespace std;class Date { public:D…

MyBatis-XML映射文件

XML映射文件 规范 XML映射文件的名称与Mapper接口名称一致&#xff08;EmpMapper对应EmpMpper.xml&#xff09;&#xff0c;并且将XML映射文件和Mapper接口放置在相同包下&#xff08;同包同名&#xff09; ​​​ 在maven项目结构中所有的配置文件都在resources目录之下&…

python与深度学习(十五):CNN和宝可梦模型

目录 1. 说明2. 宝可梦模型2.1 导入相关库2.2 建立模型2.3 模型编译2.4 数据生成器2.5 模型训练2.6 模型保存 3. 宝可梦的CNN模型可视化结果图4. 完整代码5. 宝可梦的迁移学习 1. 说明 本篇文章是CNN的另外一个例子&#xff0c;宝可梦模型&#xff0c;是自制数据集的例子。之前…

面向视频会议场景的 H.266/VVC 码率控制算法研究

文章目录 面向视频会议场景的 H.266/VVC 码率控制算法研究个人总结摘要为什么要码率控制码率控制的关键会议类视频码率控制研究背景视频会议系统研究现状目前基于 R-λ模型的码率控制算法的问题文章主要两大优化算法优化算法1&#xff1a;基于视频内容相关特征值的码率控制算法…

C# 图表控件库 ScottPlot

推荐使用ScottPlot原因&#xff1a; 1.图形界面简洁&#xff0c;样式丰富 2.代码较少 3.官方提供多种实例源码&#xff0c;并可以直接通过图形界面查看&#xff0c;便于快速开发 Github源码链接&#xff1a;https://github.com/ScottPlot/ScottPlot 官网WindowFrom Demo实例…

安防视频监控汇聚平台EasyCVR接入Ehome告警,公网快照不显示是什么原因?

智能视频监控汇聚平台TSINGSEE青犀视频EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;视频监控管理平台…

小米平板6将推14英寸版!与MIX Fold 3同步推出

今天&#xff0c;知名数码博主数码闲聊站爆料消息&#xff0c;称小米平板6将推出一款Max版本&#xff0c;预计与小米MIX Fold 3同步推出。 据介绍&#xff0c;小米平板6 Max将是小米首款14英寸大屏的旗舰平板&#xff0c;平板搭载骁龙8处理器&#xff0c;在性能释放、影音表现、…

LabVIEW深度相机与三维定位实战(下)

‍‍&#x1f3e1;博客主页&#xff1a; virobotics的CSDN博客&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f37b;上期文章&#xff1a;『LabVIEW深度相机与三维定位实战&#xff08;上&#xff09;』 &#…

计算机视觉:替换万物Inpaint Anything

目录 1 Inpaint Anything介绍 1.1 为什么我们需要Inpaint Anything 1.2 Inpaint Anything工作原理 1.3 Inpaint Anything的功能是什么 1.4 Segment Anything模型&#xff08;SAM&#xff09; 1.5 Inpaint Anything 1.5.1 移除任何物体 1.5.2 填充任意内容 1.5.3 替换任…

国内GitHub加速访问工具-Fetch GitHub Hosts

一、工具介绍 Fetch GitHub Hosts是一款开源跨平台的国内GitHub加速访问工具&#xff0c;主要为解决研究及学习人员访问 Github 过慢或其他问题而提供的 Github Hosts 同步工具。 项目原理&#xff1a;是通过部署此项目本身的服务器来获取 github.com 的 hosts&#xff0c;而…

el-table点击表格某一行添加到URL参数,访问带参URL加载表格内容并滚动到选中行位置 [Vue3] [Element-plus 2.3]

写在最前 需求&#xff1a;有个表格列出了一些行数据&#xff0c;每个行数据点击后会加载出对应的详细数据&#xff0c;想要在点击了某一行后&#xff0c;能够将该点击反应到URL中&#xff0c;这样我复制这个URL发给其他人&#xff0c;他们打开时也能看到同样的行数据。 url会根…

铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

WAF绕过-AWVS+Xray+Goby+sqlmap-绕过宝塔防火墙

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

Typescript中的元组与数组的区别

Typescript中的元组与数组的区别 元组可以应用在经纬度这样明确固定长度和类型的场景下 //元组和数组类似&#xff0c;但是类型注解时会不一样//元组赋值的类型、位置、个数需要和定义的类型、位置、个数完全一致&#xff0c;不然会报错。 // 数组 某个位置的值可以是注解中的…

数学知识(二)

一、裴蜀定理 对于任意整数a,b&#xff0c;一定存在非零整数x,y&#xff0c;使得 ax by gcd(a,b) #include<iostream> #include<algorithm>using namespace std;int exgcd(int a,int b,int &x,int &y) {if(!b){x 1,y 0;return a;}int d exgcd(b,a %…

操作系统知识点总结

操作系统知识点总结: 第一章:操作系统概述 1.1操作系统的概念: ​ 操作系统是一种系统软件,与其他系统软件和应用软件不同,它有自己的基本特征。它的四大基本特征也就是并发,共享,虚拟,异步。 1.2操作系统的特征(四大基本特征): 并发: 这里我们要理解什么是并发,什么是…

Centos7 上安装 redis-dump 和redis-load 命令

一、安装rvm 1、安装GPG keys gpg2 --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBcurl -sSL http://rvm.io/mpapis.asc | gpg2 --import - curl -sSL http://rvm.io/pkuczynski.asc | g…