当前位置: 首页 > article >正文

使用 `perf` 和火焰图(Flame Graph)进行性能分析

在现代软件开发中,性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 CPU 占用率异常高时,识别并优化性能瓶颈显得尤为重要。本文将详细介绍如何使用 Linux 下强大的性能分析工具 perf 以及火焰图(Flame Graph)来分析和优化高 CPU 占用的进程。

目录

  1. 前言
  2. 使用 perf 收集性能数据
    • 安装 perf
    • 收集数据
  3. 使用 perf report 分析数据
    • 基本使用
    • 界面导航与操作
    • 过滤与搜索
  4. 生成火焰图(Flame Graph)
    • 安装 FlameGraph 工具
    • 生成火焰图
    • 分析火焰图
  5. 优化与验证
  6. 实用技巧与常见问题
  7. 总结

前言

perf 是 Linux 内核提供的一个功能强大的性能分析工具,能够监控和分析系统及应用程序的性能瓶颈。通过 perf,开发者可以深入了解程序在运行过程中各个函数的执行情况,从而找到高 CPU 占用的根本原因。

火焰图(Flame Graph)则是一种可视化性能数据的工具,能够直观地展示函数调用的层级关系及其耗时情况。结合 perf 和火焰图,开发者可以更高效地进行性能分析和优化。

使用 perf 收集性能数据

安装 perf

在大多数 Linux 发行版中,perf 作为内核工具包的一部分,可以通过包管理器进行安装。例如,在 Ubuntu 上:

sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r)

说明:

  • linux-tools-commonlinux-tools-genericperf 工具所需的基础包。
  • linux-tools-$(uname -r) 确保安装与当前内核版本匹配的 perf 版本。

收集数据

使用 perf record 命令来采样和记录目标进程的性能数据。假设目标进程的 PID 为 252698,运行以下命令:

sudo perf record -p 252698 -F 99 --call-graph dwarf -o perf.data

参数说明:

  • -p 252698:指定要监控的进程 PID。
  • -F 99:设置采样频率为 99 Hz。
  • --call-graph dwarf:收集调用图,便于分析函数调用关系。
  • -o perf.data:指定输出文件为 perf.data

使用 perf report 分析数据

收集完性能数据后,使用 perf report 命令进行分析。

基本使用

sudo perf report -i perf.data
  • -i perf.data:指定输入文件为之前采集的 perf.data

执行上述命令后,将启动一个交互式的命令行界面,展示性能分析结果。

界面导航与操作

perf report 的交互界面主要包括以下部分:

  1. 标头信息(Header):显示基本信息,如采样总数、监控的事件类型(如 CPU cycles)、进程名称等。
  2. 汇总视图(Summary View):列出占用 CPU 最多的函数或模块,每行通常包含:
    • Overhead (%):该函数消耗的 CPU 百分比。
    • Shared Object:函数所属的共享库或可执行文件。
    • Symbol:函数名或符号名称。
  3. 函数调用详情(Function Call Details):选择某个函数后,深入查看其调用关系。

常用快捷键:

  • 上下箭头:在函数列表中移动光标。
  • 回车 (Enter):展开或进入选中的函数,查看详细的调用关系。
  • 左右箭头:折叠或展开调用树。
  • ?:查看帮助,了解更多快捷键和操作说明。
  • q:退出 perf report

过滤与搜索

为了更快地定位问题,可以使用过滤和搜索功能。

过滤

按下 / 键进行过滤,输入关键词(如函数名或模块名),例如:

/compute

这将只显示包含 “compute” 的函数。

搜索

按下 s 键可以搜索特定的符号或函数名称,输入后按回车即可高亮显示。

导出报告

如果需要将报告导出为文本文件,可以使用以下命令:

sudo perf report -i perf.data --stdio > perf_report.txt

此命令将报告以纯文本形式输出到 perf_report.txt 文件中,便于后续查看或分享。

生成火焰图(Flame Graph)

火焰图是一种直观展示函数调用层级及耗时的可视化工具。通过结合 perf 和火焰图,开发者可以更清晰地识别性能瓶颈。

安装 FlameGraph 工具

首先,需要安装由 Brendan Gregg 提供的 FlameGraph 工具:

git clone https://github.com/brendangregg/FlameGraph.git

生成火焰图

以下是生成火焰图的步骤:

  1. 导出 perf 事件数据:

    sudo perf script -i perf.data > out.perf
    
  2. 生成折叠的堆栈数据:

    ./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
    
  3. 生成火焰图 SVG 文件:

    ./FlameGraph/flamegraph.pl out.folded > flamegraph.svg
    
  4. 查看火焰图:

    使用浏览器打开 flamegraph.svg 文件,直观地查看火焰图。

分析火焰图

火焰图的每个“火焰”代表一个函数调用,宽度表示该函数消耗的 CPU 时间。堆叠的层级展示了函数调用的层级关系。通过分析火焰图,可以识别出哪些函数或调用链消耗了大量的 CPU 资源。

示例分析:

假设火焰图中,compute_heavy_task 宽度较大,表示其占用了大量 CPU 时间。深入查看该函数的调用栈,可以发现其调用了 helper_function1calculate,进一步优化这些子函数可能会显著降低整体 CPU 占用率。

优化与验证

在识别出性能瓶颈后,进行针对性的代码优化:

  1. 优化算法:改进耗时的算法,减少计算复杂度。
  2. 减少不必要的计算:避免重复计算或不必要的资源消耗。
  3. 提高并行度:利用多线程或并行计算,提高资源利用率。
  4. 缓存优化:优化内存访问,提高缓存命中率。

优化完成后,重复上述 perf 和火焰图的分析步骤,验证优化效果是否显著,确保 CPU 占用率得到有效降低。

实用技巧与常见问题

保持调试信息

为了确保 perf 能准确解析函数名和源代码位置,编译应用程序时应包含调试信息。例如,使用 gcc 编译时添加 -g 选项:

gcc -g -o myapp myapp.c

处理容器化环境中的符号问题

当在容器中运行应用程序时,perf 可能无法正确解析容器内部的符号,导致“Unregistered symbol…”错误。解决方法如下:

  1. 确定容器的 rootfs 路径

    • Device Mapper 类型
      docker inspect --format='{{.GraphDriver.Data.MergedDir}}' <container_id>
      
    • Overlay 类型
      使用 docker export 命令导出容器的 rootfs:
      docker export <container_id> -o container_rootfs.tar
      mkdir container_rootfs
      tar -xf container_rootfs.tar -C container_rootfs
      
    • 富容器(如 Podman 等)
      直接使用外置的 rootfs 路径。
  2. 使用 --symfs 参数指定 rootfs 路径

    sudo perf record --symfs /path/to/container/rootfs -p 252698 -F 99 --call-graph dwarf -o perf.data
    sudo perf script --symfs /path/to/container/rootfs -i perf.data > out.perf
    
  3. 继续生成火焰图

    ./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
    ./FlameGraph/flamegraph.pl out.folded > flamegraph.svg
    

通过上述步骤,perf 能正确解析容器内部的符号,生成准确的火焰图。

多核处理

在多核心系统上,perf 会自动采样所有 CPU 核心的数据。如果需要针对特定的 CPU 核心进行分析,可以使用 -C 选项指定核心编号:

sudo perf record -C 0 -p 252698 -F 99 --call-graph dwarf -o perf.data

这将仅监控 CPU 核心 0 上的性能数据。

性能开销

虽然 perf 是轻量级的性能分析工具,但在高频率采样或长时间运行时,仍可能对系统性能产生一定影响。建议在测试环境或非高峰时段进行分析。

持续监控与自动化

对于需要持续监控的应用,可以编写脚本定期运行 perf 采样并生成报告,结合 cron 定时任务和报警机制,实现自动化性能监控。

总结

使用 perf 收集和分析高 CPU 占用进程的性能数据,并结合火焰图进行直观的可视化分析。通过识别热点函数和调用关系,针对性地进行代码优化,可以显著提升应用程序的性能表现。

工作流程总结:

  1. 收集性能数据:使用 perf record 监控目标进程,生成 perf.data
  2. 分析数据:使用 perf report 查看热点函数和调用关系。
  3. 生成火焰图:通过 perf script 和 FlameGraph 工具生成火焰图,直观分析。
  4. 优化代码:根据分析结果优化代码,降低 CPU 占用。
  5. 验证效果:重新进行性能分析,确认优化效果。

通过不断迭代这一过程,您可以逐步优化应用程序,提升其性能和稳定性。

相关文章:

使用 `perf` 和火焰图(Flame Graph)进行性能分析

在现代软件开发中&#xff0c;性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 CPU 占用率异常高时&#xff0c;识别并优化性能瓶颈显得尤为重要。本文将详细介绍如何使用 Linux 下强大的性能分析工具 perf 以及火焰图&#xff08;Flame Graph&#xff09…...

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java虚拟机&#xff09;退出的情况通常是…...

实验6 电子邮件

实验6 电子邮件 1、实验目的 理解电子邮件系统基本结构 理解客户端和服务器端&#xff0c;以及服务器之间的通信 分析理解SMTP&#xff0c;POP3协议 2、实验环境 硬件要求&#xff1a;阿里云云主机ECS 一台。 软件要求&#xff1a;Linux/ Windows 操作系统 3、实验内容…...

AI大模型从0到1记录学习numpy pandas day24

第 1 章 环境搭建 1.1 Anaconda 1.1.1 什么是Anaconda Anaconda官网地址&#xff1a;https://www.anaconda.com/ 简单来说&#xff0c;Anaconda Python 包和环境管理器&#xff08;Conda&#xff09; 常用库 集成工具。它适合那些需要快速搭建数据科学或机器学习开发环境的用…...

深入理解浏览器渲染引擎:底层机制与性能优化实战

现代浏览器背后是一个庞大而复杂的系统工程&#xff0c;渲染引擎作为核心模块之一&#xff0c;承担着从解析 HTML/CSS 到最终绘制页面的关键职责。本文将从底层机制出发&#xff0c;系统梳理渲染引擎&#xff08;如 Blink&#xff09;工作原理、V8 与渲染流程的协作方式&#x…...

大模型浪潮下,黑芝麻智能高性能芯片助力汽车辅助驾驶变革

在全球汽车产业向智能化、网联化加速转型的浪潮中&#xff0c;大模型技术的崛起为汽车领域带来了前所未有的变革机遇。黑芝麻智能在高性能芯片和基础软件架构领域的持续创新&#xff0c;正全力推动汽车智能化的发展&#xff0c;为行业注入新的活力。 大模型全面助力辅助驾驶迈…...

鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp

使用UniApp制作多选框与单选框组件 前言 在移动端应用开发中&#xff0c;表单元素是用户交互的重要组成部分。尤其是多选框&#xff08;Checkbox&#xff09;和单选框&#xff08;Radio&#xff09;&#xff0c;它们几乎存在于每一个需要用户做出选择的场景中。虽然UniApp提供…...

康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX

目录 一、OpenDRIVE&#xff1a;兼容多版本地图标准 &#xff08;1&#xff09;Atlas 工作流 &#xff08;2&#xff09;UE Plugin 工作流 二、OpenSCENARIO&#xff1a;标准化动态行为建模 三、OpenCRG&#xff1a;还原毫米级路面细节 四、OpenMATERIAL&#xff1a;更真…...

VMware中快速安装与优化Ubuntu全攻略

准备工作 在开始安装之前&#xff0c;确保已经下载了VMware Workstation或VMware Player&#xff0c;并准备好Ubuntu的ISO镜像文件。VMware Workstation是一款功能强大的虚拟机软件&#xff0c;支持在Windows或Linux主机上运行多个操作系统。 创建虚拟机 打开VMware Worksta…...

GPUGeek云平台实战:DeepSeek-R1-70B大语言模型一站式部署

随着人工智能技术的迅猛发展&#xff0c;特别是在自然语言处理领域&#xff0c;大型语言模型如DeepSeek-R1-70B的出现&#xff0c;推动了各行各业的变革。为了应对这些庞大模型的计算需求&#xff0c;云计算平台的普及成为了关键&#xff0c;特别是基于GPU加速的云平台&#xf…...

无人机动力系统全解析:核心组件、工作原理与实用指南

无人机想要实现稳定飞行与灵活操控&#xff0c;离不开一套高效协同的动力系统。该系统以电机、电子调速器&#xff08;电调&#xff09;、电池和螺旋桨四大核心组件为基础&#xff0c;各部分精密配合&#xff0c;共同驱动无人机翱翔蓝天。接下来&#xff0c;本文将从基础原理入…...

【C语言】初阶数据结构相关习题(二)

&#x1f386;个人主页&#xff1a;夜晚中的人海 今日语录&#xff1a;知识是从刻苦劳动中得来的&#xff0c;任何成就都是刻苦劳动的结果。——宋庆龄 文章目录 &#x1f384;一、链表内指定区间翻转&#x1f389;二、从链表中删去总和值为零的节点&#x1f680;三、链表求和&…...

嵌入式学习--江科大51单片机day7

我们在听课的过程中&#xff0c;可能对老师讲的有疑问&#xff0c;或者有些自己的理解&#xff0c;我们可以去问豆包&#xff0c;包括在写博客的时候我也是&#xff0c;不断去问豆包保证思考的正确性。&#xff08;有人感觉豆包很low啊&#xff0c;其实这些基础性的东西豆包一般…...

基于大模型预测围术期麻醉苏醒时间的技术方案

目录 一、数据收集与处理(一)数据来源(二)数据预处理二、大模型构建与训练(一)模型选择(二)模型训练三、围术期麻醉苏醒时间预测(一)术前预测(二)术中动态预测四、并发症风险预测(一)风险因素分析(二)风险预测模型五、基于预测制定手术方案(一)个性化手术规划…...

Element Plus 取消el-form-item点击触发组件,改为原生表单控件

文章目录 问题&#xff1a;方法一&#xff1a;使用全局样式覆盖&#xff08;推荐&#xff09;方法二&#xff1a;自定义指令&#xff08;更灵活&#xff09;方法三&#xff1a;封装高阶组件方法四&#xff1a;运行时DOM修改&#xff08;不推荐&#xff09; 问题&#xff1a; 描…...

javascript —— ! 和 !! 的区别与作用

javascript —— ! 和 !! 的区别与作用 在 JavaScript 里&#xff0c;! 和 !! 是两种不同的逻辑运算符&#xff0c;它们的功能和使用场景有明显区别。 1、 !&#xff08;逻辑非运算符&#xff09; 它的主要作用是 对操作数进行布尔值取反。具体来说&#xff0c;就是 先把操作…...

鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集

ArkUI 组件速查表 鸿蒙应用开发页面上需要实现的 UI 功能组件如果在这 100 多个组件里都找不到&#xff0c;那就需要组合造轮子了 使用技巧&#xff1a;先判断需要实现的组件大方向&#xff0c;比如“选择”、“文本”、“信息”等&#xff0c;或者是某种形状比如“块”、“图…...

LLM笔记(三)位置编码(1)

位置编码理论与应用 1. 位置编码如何解决置换不变性及其数学表现 在Transformer模型中&#xff0c;自注意力机制&#xff08;Self-Attention&#xff09;具有置换不变性&#xff08;permutation invariance&#xff09;&#xff0c;这意味着对输入序列的词元&#xff08;toke…...

麒麟v10 部署 MySQL 5.6.10 完整步骤

需要包的私信我 一、安装依赖&#xff08;Perl环境&#xff09; # 在线安装依赖 yum -y install perl perl-devel# 离线安装&#xff08;需提前下载好rpm包&#xff09; mkdir /data/ybn/soft/pre yum install --downloadonly --downloaddir/data/ybn/soft/pre perl perl-dev…...

Git-学习笔记(粗略版)

前言 很多人都听过git&#xff0c;github这些名词,但是它们是什么&#xff0c;怎么使用&#xff1f;git和github是一个东西吗&#xff1f;本文将详细解答这些问题&#xff0c;彻底弄懂git。 1.Git是啥❓ 有一天&#xff0c;我们的插画师小王接到一个绘画订单&#xff0c;但奈…...

专项智能练习(定义判断)

1. 单选题 热传导是介质内无宏观运动时的传热现象&#xff0c;其在固体、液体和气体中均可发生。但严格而言&#xff0c;只有在固体中才是纯粹的热传导&#xff0c;在流体&#xff08;泛指液体和气体&#xff09;中又是另外一种情况&#xff0c;流体即使处于静止状态&#xff…...

失控的产品

大部分程序员很难有机会做一个新的产品&#xff0c;绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会&#xff0c;从2023年开始做&#xff0c;中间经历了许多磕磕碰碰。 有的小伙伴从中离开&#xff0c;偶尔又加入1~2个人&#xff0c;但…...

【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error

Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考&#xff1a;https://www.bilibili.com/opus/977469285985157129 A9 - A11&#xff08;iPhone6s&#xff0d;X&#xff09;&#xff1a;iOS15.0-16.6.1 A12-A14&#xff08;iPhoneXR&#xff0d;12PM&#xf…...

无线定位之 二 SX1302 网关源码 thread_down 线程详解

前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

对心理幸福感含义的探索 | 幸福就是一切吗?

注&#xff1a;机翻&#xff0c;未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗&#xff1f;对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …...

多平台图标设计与管理的终极解决方案

IconWorkshop Pro 是一款由Axialis团队开发的专业图标设计与制作软件&#xff0c;专注于为设计师、开发者及企业用户提供高效且灵活的图标创作解决方案。该软件凭借其强大的功能与跨平台适配性&#xff0c;成为Windows、macOS、iOS、Android等多系统图标设计的首选工具之一。 …...

ngx_http_keyval_module动态键值管理

一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module&#xff0c;说明模块已编译进 NGINX。 若未找到&#xff0c;请联系你的 NGINX 供应商&#xff0c;获取商业版或重新编译并启用该模块&am…...

【高频面试题】LRU缓存

文章目录 1 相关前置知识&#xff08;OS&#xff09;2 面试题 16.25. LRU 缓存2.1 题面2.2 示例2.3 解法1 &#xff08;双端队列哈希表&#xff09;思路 2.4 解法2思路 3 参考 1 相关前置知识&#xff08;OS&#xff09; 为什么需要页面置换算法&#xff1a;当进程运行时&…...

讯联云库项目开发日志(二)AOP参数拦截

目录 利用AOP实现参数拦截: 一、​​HTTP请求进入Controller​&#xff08;发送邮件验证码&#xff09; 二、AOP切面触发 1. 切面拦截&#xff08;GlobalOperactionAspect.class&#xff09; method.getAnnotation()​​ null interceptor 判断​​ 2.参数校验注解 3. 参…...

龙虎榜——20250515

上证指数缩量收阴线&#xff0c;个股跌多涨少&#xff0c;上涨波段4月9日以来已有24个交易日&#xff0c;时间周期上处于上涨末端&#xff0c;注意风险。 深证指数缩量收阴线&#xff0c;日线上涨结束的概率在增大&#xff0c;注意风险。 2025年5月15日龙虎榜行业方向分析 一…...