Linux最直观的性能分析(热点分析)-编译perf并生成火焰图

news2024/9/20 6:35:36


 本文先介绍了linux下perf工具的使用场景,然后对命令行安装和源码编译安装两种方式做了说明,接下来通过最简单的perf top命令给出perf的直观印象,最后通过perf record生成火焰图的方式说明如何发现进程中的函数热点。

一、perf工具介绍

perf,也叫perf_events,最初被称为Linux的性能计数器,是Linux中的一种性能分析工具,自2009年的Linux内核版本2.6.31起可用。

通过命令行方式访问,并提供一系列子命令,能对整个系统(包括内核和用户空间代码)进行统计分析。

支持硬件性能计数器、跟踪点、软件性能计数器(例如hrtimer)以及动态探针(例如kprobes或uprobes)。

2012年,两位IBM工程师将perf(以及OProfile)认定为Linux上最常用的两种性能计数器分析工具之一。

二、应用场景

  • CPU性能分析:Perf可以监测程序的CPU使用情况,包括每个函数的执行时间和调用次数,帮助找出CPU密集型程序的性能瓶颈。

  • 内存性能分析:Perf工具可以监测程序的内存分配和释放情况,帮助开发者发现内存泄漏等问题。使用perf mem -p 命令可以监测特定进程的内存使用情况。

  • 线程性能分析:Perf工具还可以用于分析多线程程序的运行情况,包括线程的创建、销毁和调度等,对优化多线程程序的性能有帮助。

  • 实时性能监控:perf top命令可以实时显示程序的运行数据,类似于top命令,能够实时查看程序的CPU占用率和调用栈等信息。

  • 性能数据统计:perf stat命令可以统计程序的运行数据,显示程序的CPU占用率、上下文切换次数、内存访问次数等指标。

  • 系统瓶颈定位:Perf工具能够帮助系统管理员快速发现系统中的性能问题,并采取相应措施进行优化,如使用perf top实时监控耗费CPU资源的函数。

  • 硬件性能评估:Perf工具也可用于评估硬件性能,如使用perf bench命令进行内置基准测试,测试内存带宽等。

  • 生成火焰图:Perf可以结合FlameGraph工具生成火焰图,这是一种可视化方法,通过火焰图可以直观地看出程序中哪些部分占用了更多的资源,从而帮助开发者进行性能调优。

  • 长时间监控与分析:Perf工具可以用于长时间的系统性能监控,例如记录全系统性能数据,持续时间可以长达一天。

三、perf安装

1. 通过命令行方式安装

sudo apt install linux-tools-common
sudo apt install linux-tools-generic

注意:在命令行中输入perf可验证是否安装成功

2. 通过编译方式安装

当嵌入式板端环境限制,无法通过apt-get安装情况下,可以在开发环境下编译好打包后放到板子。

注意:请根据使用的linux内核版本编译对应的perf工具

2.1 查看linux内核版本
cat /proc/version

2.2 下载linux内涵源码
# 可以在这个网站选择对应内核版本下载:https://mirrors.edge.kernel.org/pub/linux/kernel/
curl -o linux-source.4.9.253.tar.gz https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.9.253.tar.gz

2.3 编译perf工具
cd linux-4.14.61
make -C tools/perf/

注意:出了get_cpuid这个缺失并不影响外,其他的尽量都安装一下

2.4 安装
# 编译过之后,perf在 tools/perf/perf
# 通过ldd查看perf的依赖库,将对应的依赖库(非系统库)一起打包
make -C tools/perf help
make prefix=./install install

四、perf使用

1. perf查看支持事件

perf list

2. perf top实时查看进程CPU和调用堆栈

perf top -g -p $PID

3. perf record记录数据并生成火焰图

火焰图是一种最直观的查看应用程序性能的可视化工具,通过火焰图可以快速定位程序性能瓶颈

3.1 采集perf数据

注意:数据采集和转换成unfold数据必须在待测试程序在运行的机器上执行

# -F可以指定采集频率,如果CPU性能不行,可以适当降低数值
# 后台采集120秒数据
perf record -p ${pid} -a -g -F 3000 -o myappperf.data -- sleep 120 &
# 采集完成后需要生成unfold数据,这一步耗时较长,但是
perf script -i ${perf_data_file} &> myappperf.unfold
3.2 生成火焰图

这一步可以在任意一台机器上运行

# 安装c++filt ,这个工具主要是将c++符号转化为更适合人看的格式
sudo apt-get install c++filt

# 下载将perf数据生成火焰图的工具
git clone https://github.com/brendangregg/FlameGraph.git

# 生成火焰图  
cd FlameGraph
./stackcollapse-perf.pl myappperf.unfold | c++filt &> myappperf.folded
./flamegraph.pl myappperf.folded > myappperf.svg
3.3 查看火焰图

使用google浏览器就可以查看火焰图,点击每个函数名可以查看具体信息

3.4 根据火焰图查看热点函数

火焰图中每个函数上都有对应的百分比数值,代表了这个函数在进程中的占用时间

耗时较多的函数一般也是程序热点函数,对这些函数进行优化,可以显著提高程序性能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

00 JavaWeb

学习资料:B站视频-黑马程序员JavaWeb基础教程 文章目录 JavaWeb1、JavaWeb简介2、 JavaWeb主要内容3、JavaWeb技术栈4、JavaWeb课程安排5、Web核心课程安排 JavaWeb 1、JavaWeb简介 Web:全球广域网,也称为万维网(www),能够通过浏…

C++: 链表回文结构/分割链表题解

目录 1.链表的回文结构 分析 代码 2.链表分割 ​编辑分析 代码 1.链表的回文结构 分析 这道题的难点是空间复杂度为O(1) 结合逆置链表找到链表的中间节点就可以解决了。 先找到链表的中间节点,再对中间节点的下一个节点进行逆置&…

macbook pro大模型推理

安装与配置 参考github ollama 链接安装ollama。安装完成后,安装常用的模型,下载速度超快。 性能测试 在进行实际测试之前,我首先对模型进行了预处理,以确保其在 M3 Max 上能够高效运行。测试过程中,我主要关注了以下几个方面: 模型加载时间 加载大型模型通常需要较…

Python WebUIAPI:打造交互式Web界面的利器

Python WebUIAPI:打造交互式Web界面的利器 引言:交互式Web界面的革新 在当今快速发展的互联网时代,Web界面的交互性已成为衡量用户体验的重要标准。Python作为一门流行的编程语言,其生态中涌现出许多强大的库来帮助开发者构建交互…

组队学习——贝叶斯分类器

前言 本次数据继续沿用上一次主题的【组队学习——支持向量机-CSDN博客】 数据处理部分延续【组队学习——支持向量机】主题的处理办法对应划分训练集和验证集 模型选择 本次贝叶斯分类器模型的较多,常用的为高斯朴素贝叶斯分类器、多项式朴素贝叶斯分类器、伯努…

2024年超好用的4款PDF阅读器推荐

PDF文件已经是我们平时常常会接触到的文件,但是无论是阅读和编辑都需要依赖一些工具,所以今天给大家介绍的是4个很多人都在使用的PDF阅读器。 1、福昕PDF阅读软件 这款PDF编辑器是一个大厂其他的产品,功能非常的强大,…

Build a Large Language Model (From Scratch)GPT-4o翻译和代码每行中文注释Ch4

目录 4 Implementing a GPT model from Scratch To Generate TextThis chapter covers4.1 Coding an LLM architectureListing 4.1 A placeholder GPT model architecture class4.2 Normalizing activations with layer normalization4.3 Implementing a feed forward network …

STM32CUBEMX_SPI_驱动WS2811灯带

STM32CUBEMX_SPI_驱动WS2811灯带 前言: 关于这种带芯片的之前我都是使用GPIO模拟时序,但是带来一个很大的弊端,那就是严重占用CPU资源,使得其他代码逻辑没办法正常执行了,想办法搞一个单片机的外设使用DMA功能&#xf…

LeetCode-day21-1186. 删除一次得到子数组最大和

LeetCode-day21-1186. 删除一次得到子数组最大和 题目描述示例示例1:示例2:示例3: 思路代码 题目描述 给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得…

【学术研究、研究热点、最新前沿】如何跟踪最新的论文

1.跟踪arxiv 使用https://www.arxivdaily.com/接收每天的推送。 2.跟踪热点文章的引用 使用semantic scholar。 3.跟踪某个学术大佬或者主题 3.1 使用web of science。 3.2 使用文献鸟 4.跟踪某个期刊

pico+unity3d 射线交互教程

前期配置:环境配置参考教程一,手部模型参考教程二,场景基于上一篇搭建。 最终效果:手部射线(初始不可见)对准 UI 显示,按下手柄 Trigger 键与可交互 UI(如 Button、Toggle、Slider …

Android APP 基于RecyclerView框架工程(知识体系积累)

说明:这个简单的基于RecyclerView的框架作用在于自己可以将平时积累的一些有效demo整合起来(比如音视频编解码的、opengles的以及其他也去方向的、随着项目增多,工程量的增加,后期想高效的分析和查找并不容易)&#xf…

vscode 环境

这张截图显示的是在VS Code(Visual Studio Code)中选择Python解释器的界面。不同的Python解释器及其虚拟环境列出了可选项,用户可以根据需要选择合适的解释器来运行Python代码。以下是对截图中信息的详细解释: 解释器选择界面 当…

Java小技能:多级组织机构排序并返回树结构(包含每个层级的子节点和业务数据集合)

文章目录 引言I 实体定义1.1 部门1.2 用户组织机构中间表1.3 树状DTOII 抽取组织机构排序方法2.1 树状排序方法2.2 案例III 查询条件构建3.1 根据部门进行权限控制3.2 注入风险引言 需求: 根据组织机构进行数据授权控制,例如控制船舶、船舶设备、摄像头、港区查看权限。 一…

05_解封装和解码

1. 基本概念 容器就是一种文件格式,比如flv、mkv、mp4等。包含下面5种流以及文件头信息。 流是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。 包在ffmpeg中代表已经编码好的一…

【LINUX】pr_info函数开发摸索

1、打印开关可随时控制,开机如果要修改是否打印日志的话,需要修改代码重新编译内核才行,其实如果真要搞,应该有其他方法; 2、打印次数,当前代码里边写的是1000次,其实可以根据传参动态修改打印…

CUDA编程00 - 配置CUDA开发环境

第一步: 在一台装有Nvidia显卡和驱动的机器上,用nvidia-smi命令查看显卡所支持cuda版本 第二步: 到Nvidia官网下载CUDA Toolkit并安装,CUDA Toolkit Archive | NVIDIA Developer 安装时按提示下一步即可,安装完成用 …

Django cursor()增删改查和shell环境执行脚本

在Django中,cursor()方法是DatabaseWrapper对象(由django.db.connectio提供)的一个方法,用于创建一个游标对象。这个游标对象可以用来执行SQL命令,从而实现对数据库的增删改查操作。 查询(Select&#xff0…

C++初学者指南-5.标准库(第一部分)--标准库查询存在算法

C初学者指南-5.标准库(第一部分)–标准库查询存在算法 文章目录 C初学者指南-5.标准库(第一部分)--标准库查询存在算法any_of / all_of / none_ofcountcount_if相关内容 不熟悉 C 的标准库算法? ⇒ 简介 any_of / all_of / none_of 如果在输入范围(所有元素…

2024最新教程,在docker中安装kali,并配置ssh连接

docker的基本使用:搭建高效攻防靶场vulfocus与Docker仓库管理实战:从听说到入门 拉取kali官方镜像 docker pull kalilinux/kali-rolling 启动一个kali镜像,将容器中的22端口映射到主机100端口,方便ssh直接连接 docker run -it…