性能工具perf的用法以及如何绘制性能火焰图

【perf】perf工具的使用&生成火焰图 perf是Linux系统中的一个性能分析工具,它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,常用于性能瓶颈的查找和热点代码的定位。:对被检测对象进行采样,最简单的是根据tick中断进行采样,即在tick中断内触发采样点,在采样点中判断程序当时的上下文。perf diff用于比较两个或多个perf.data文件的性能分析结果,帮助开发者快速识别优化前后的性能差异。perf stat 可以查看程序的运行情况,执行该命令时收集性能统计信息. 阅读详情

perf简介

Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。其基于事件采样原理,以性能事件为基础,常用于性能瓶颈的查找与热点代码的定位。

性能调优工具如 perf,Oprofile 等的基本原理都是对被监测对象进行采样,最简单的情形是根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当时的上下文。假如一个程序 90% 的时间都花费在函数 foo() 上,那么 90% 的采样点都应该落在函数 foo的上下文中。只要采样频率足够高,采样时间足够长,那么以上推论就比较可靠。因此,通过 tick 触发采样,我们便可以了解程序中哪些地方最耗时间,从而重点分析。

稍微扩展一下思路,就可以发现改变采样的触发条件使得我们可以获得不同的统计数据:

  • 以时间点 ( 如 tick) 作为事件触发采样便可以获知程序运行时间的分布。
  • 以 cache miss 事件触发采样便可以知道 cache miss 的分布,即 cache 失效经常发生在哪些程序代码中
  • 等等其他事件

当然,perf使用更多是CPU的PMU计数器,PMU计数器是大部分CPU都有的功能,它们可以用来统计比如L1 Cache失效的次数,分支预测失败的次数等。PMU可以在这些计数器的计数超过一个特定的值的时候产生一个中断,这个中断,我们可以用和时钟一样的方法,来抽样判断系统中哪个函数发生了最多的Cache失效,分支预测失效等。

perf 用法

本文示例代码:

//
// Created by wilcohuang on 2018/11/19.
//

#include <unistd.h>

using namespace std;

#define NUM 500000

void init(int *int_array) {
    for (int i = 0; i < NUM; i++) {
        int_array[i] = i;
    }
}

void accu(int *int_array, long &sum) {
    for (int i = 0; i < NUM; i++) {
        sum += int_array[i];
        usleep(3);
    }
}

int main() {
    int int_array[NUM];
    init(int_array);
    long sum = 0;
    accu(int_array, sum);
}

说明

perf的使用可以分为两种方式:

  1. 直接使用perf启动服务
  2. 挂接到已启动的进程
    第一种方式不需要root权限,第二种方式需要root权限

perf top

用于查看cpu的主要性能消耗点

跟踪一个名为main的进程:

perf top -e cycles -p `pgrep main`

输入如下:
在这里插入图片描述

perf record

同样是分析诊断进程:

perf record -e cpu-clock -g ./run
或者
perf record -e cpu-clock -g -p 4522

使用ctrl+c中断perf进程,或者在程序执行结束后,会产生perf.data的文件,使用
perf report
会产生结果分析,如图
在这里插入图片描述

火焰图

上面通过文件查看不够直观,还有一种火焰图分析的方式:
工具下载:
git clone https://github.com/brendangregg/FlameGraph.git
使用命令:

使用perf script工具对perf.data进行解析perf script -i perf.data &> perf.unfold
将perf.unfold中的符号进行折叠:/data/stackcollapse-perf.pl perf.unfold &> perf.folded
最后生成svg图:/data/flamegraph.pl perf.folded > perf.svg

然后可以通过chrome或者看图软件打开:
r

Y轴表示调用栈,X轴越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

所以,一般我们只需要看有没有出现 “平顶”,如果有,那么这个函数可能有性能问题。

perf diff

优化程序性能后,我们自然要看下效果:
perf diff perf.data perf.data.before

我们干掉了上文中的usleep(3);这句代码,然后diff结果输出如下:

init、accu函数的时间占比已经将为了0 ?

权限问题

perf如果不是root,你可以做什么取决于sysctl设置。kernel.perf_event_paranoid

cat /proc/sys/kernel/perf_event_paranoid

kernel.perf_event_paranoid= 2:您无法进行任何测量。该perf实用程序可能仍然是有用的分析现有的记录用perf ls,perf report,perf timechart或perf trace。
kernel.perf_event_paranoid= 1:您可以使用perf stator 跟踪命令perf record,并获取内核分析数据。
kernel.perf_event_paranoid= 0:您可以使用perf stat或跟踪命令perf record,并获取CPU事件数据。
kernel.perf_event_paranoid= -1:您获得了对内核跟踪点的原始访问权限(具体来说,您可以mmap创建文件perf_event_open,我不知道其含义是什么)。

参考

更全的perf参考:

本文参考:

perf学习笔记(7)之火焰图 flamegraph 介绍火焰图 阅读详情

相关推荐

C++性能分析-perf火焰图

C++使用perf火焰图分析性能

程序喵的博客 2454

/proc/sys/kernel/文档(三)

文章目录perf_event_paranoid参考文档 perf_event_paranoid 控制非特权用户对性能事件系统的使用(无CAP_SYS_ADMIN)。预设值为2。 -1 允许所有用户使用(几乎)所有事件 在没有CAP_IPC_LOCK的情况下,忽略perf_event_mlock_kb之后的mlock限制 = 0 没有CAP_SYS_ADMIN的用户不允许ftrac...

运维狗的备忘录 3876

C++ Perf性能调优+火焰图调优

通过本文介绍应该对PERF有了基本的认识,还有很多方法来查看软件的热点函数,如GPERF、GPROF等,你可以自己深入去研究,本文希望能够起到抛砖引玉的作用。

weixin_44834554的博客 3550

【性能】perf + 火焰图分析软件性能瓶颈

一、perf 命令 让我们从 perf 命令(performance 的缩写)讲起,它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。 通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。 $ sudo perf record -F 99 -p 13204 -g -- sleep 30 上面的代码中,perf record表示记录,-F 99表示每秒9

我的笔记本 1万+

C++:perf详解 + Flame Graph火焰图分析程序性能

因为项目需求,C++和java同时在搞,最近了解到Flame Graph火焰图这个工具,网上查了查资料,这里记录一下。 1 介绍 web site http://www.brendangregg.com/flamegraphs.html git: https://github.com/brendangregg/FlameGraph 火焰图是一个可视化工具,可以将诸多性能检测相...

zzhongcy的专栏 1万+

基于perf + 火焰图定位Postgres数据库性能问题

目 录 学习参考书籍、网站或博文: 参考书籍:《PostgreSQL数据库内核分析》 Lex & Yacc 点击前往 Postgresql源码学习之词法和语法分析 点击前往 Postgres数据库之词法分析和语法分析学习汇总 1、perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果; perf record perf report 举例: sudo .

qq_40310161的博客 4956

Linux下用火焰图进行性能分析

优快云 GitHub Linux下用火焰图进行性能分析 LDD-LinuxDeviceDrivers/study/debug/tools/perf/flame_graph 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调

OSKernelLAB(gatieme) 6万+

linux 性能调优工具perf + 火焰图 常用命令

本文是从本人笔记直接搬运过来,将就着看perf性能分析:生成火焰图(执行1-4步骤):1、perf record -e cpu-clock -g -p pid (perf record -F 99 -g -p pid 99HZ采样)-g 选项是告诉perf record额外记录函数的调用关系-e cpu-clock 指perf record监控的指标为cpu周期-p 指定需要record的...

a6788578的博客 1万+

perf工具简介+火焰图制作与解读

perf工具简介+火焰图制作与解读 1、perf工具简单原理 perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。它不但可以分析指定应用程序的性能问题(per thread),也可以用来分析内核的性能问题,当然也可以同.

8844

C++笔记之linux环境perf生成火焰图

— 2024-04-01 中午。

小勇博客 3182

【工具】使用perf抓取火焰图

perf采集数据生成火焰图

Sunrise的专栏 3261

perf生成火焰图

perf生成火焰图

Yang的博客 9237

Jetson Nano摄像头选型与配置全攻略:CSI与USB接口实战指南

在嵌入式视觉与边缘计算项目中,摄像头作为核心传感器,其选型与配置直接影响系统性能。CSI(Camera Serial Interface)和USB(Universal Serial Bus)是两种主流接口,前者通过MIPI CSI-2协议直接与SoC通信,具备低延迟、高带宽特性,适合实时性要求高的应用;后者基于通用串行总线标准,即插即用,通用性强。在NVIDIA Jetson Nano平台上,合理选择摄像头接口并优化驱动配置,能充分发挥其GPU加速优势,提升图像处理流水线效率。本文聚焦Jetson Nano

weixin_29190651的博客 323

Linux 之 perf性能分析(火焰图)

项目开发的程序,运行定位问题方法很多,这里介绍使用perf软件查看程序问题 1.使用perf采样 1.直接使用perf启动服务 # perf record -g ls -------------------------------- 2.挂接到已启动的进程 # 使用PID监控程序 # sudo perf record -e cpu-clock -g -p pid # 使用程序名监控程序 # sudo perf record -e cpu-clock -g -p `pgrep your_program` -

enjoy.day 6261

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9655

超声波 vs 红外 vs 激光雷达:扫地机器人避障传感器选型指南(实测对比)

本文深入对比了扫地机器人三种主流避障传感器——超声波、红外与激光雷达的核心原理与实测表现。文章基于成本、精度、环境适应性等关键指标,提供了清晰的选型决策树和典型场景配置方案,旨在帮助开发者与爱好者根据项目需求与预算,构建高效可靠的机器人避障系统。

h0i1j2k3l的博客 690

perf与火焰图使用介绍

一、介绍 perf是linux上的性能分析工具,perf可以对event进行统计得到event的发生次数,或者对event进行采样,得到每次event发生时的相关数据(cpu、进程id、运行栈等),利用这些数据来对程序性能进行分析。 perf可以统计或采样的event有很多,如果我们要分析cpu,那么我们可以使用cpu-cycles、cpu-clock来衡量占用cpu的程序的分布情况,还可以通过cache-misses、page-faults、branch-misses等event来分析造成cpu占用高的底

cocoti的博客 6890

别再死磕RD算法了!用MATLAB手把手复现SAR后向投影(BP)成像(附完整代码与避坑点)

本文详细介绍了如何使用MATLAB实现合成孔径雷达(SAR)后向投影(BP)成像算法,突破传统RD算法在大斜视和复杂轨迹场景中的局限。通过完整的代码示例和避坑指南,帮助读者掌握BP算法的核心原理、内存优化策略和并行计算技巧,提升SAR成像精度与效率。

weixin_30908103的博客 296

Linux性能分析工具 - perf 和火焰图

linux 性能分析工具 perf 和火焰图

qazw9600的专栏 5801

Pascal Context数据集实战:从安装到格式转换的完整指南

本文提供了Pascal Context数据集的完整实战指南,从安装配置到格式转换的详细步骤。Pascal Context是计算机视觉领域重要的语义分割数据集,包含540个精细标注类别。文章涵盖数据集下载、环境配置、预处理技巧和常见问题解决方案,帮助开发者高效利用这一数据集进行场景理解任务。

weixin_30216561的博客 616

Cadence 17.2 OrCAD原理图库实战:从零创建电阻/电容/LED元件(附封装技巧)

本文以Cadence 17.2 OrCAD为核心,详细讲解了如何从零开始工程化地创建电阻、电容、LED等原理图库元件。内容涵盖库架构设计、符号绘制、引脚属性管理、封装关联技巧以及设计规则检查,旨在帮助硬件工程师构建规范、可复用且易于维护的元件库,为高效PCB设计奠定坚实基础。

weixin_29195615的博客 399

火焰图的基本认识与绘制方法

每隔一个固定的时间,就在CPU上(每个核上都有)产生一个中断,在中断上看看,当前是哪个pid,哪个函数,然后给对应的pid和函数加一个统计值,这样,我们就知道CPU有百分几的时间在某个pid,或者某个函数上了。2.x 轴表示抽样数, 如果一个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长. 注意,x 轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的.常见的火焰图类型有 On-CPU,Off-CPU,还有 Memory,Hot/Cold,Differential 等等。

m0_68678128的博客 3549

免费大容量国外网盘测评:冷数据归档与rclone加密接入

云存储的本质,是通过对象存储、冗余编码和分层缓存,把本地磁盘容量问题转化为网络访问与数据管理问题。免费大容量国外网盘常以空间换用户规模或付费转化,容量政策、传输策略、协议支持和退出成本,往往比标称容量更决定长期可用性。支持 WebDAV、S3 兼容和命令行工具的服务,可接入 rclone 等自动化流程,再配合客户端加密与冷热分层,用于冷数据归档、老项目备份和家庭影像保存。理解带宽换算、单文件上限、保活机制与传输一致性后,评估话题型大容量网盘与专业向协议网盘,就能把免费空间纳入可靠存储层。围绕免费大容量国外网

weixin_31292729的博客 210

调试工具:perf+火焰图

在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。火焰图(Flame Graph)是由Linux性能优化大师Brendan Gregg发明的,Flame Graph以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能的调用栈。其他的呈现方法,一般只能列出单一的调用栈或者非层次化的时间分布。

一刀 1434

2025年下半年网络工程师案例分析真题及答案解析

2025年下半年网络工程师案例分析真题及答案解析

鹿鸣天涯 1085

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 反汇编专用工具——objdump
下一篇: AT&T汇编之32位与64位系统调用
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值