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

news2025/5/16 11:06:46

在现代软件开发中,性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 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. 验证效果:重新进行性能分析,确认优化效果。

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

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

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

相关文章

什么情况会导致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、实验内容…

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

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

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

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

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

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

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

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

【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; 描…

Git-学习笔记(粗略版)

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

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

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

【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…

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

注&#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 …

【高频面试题】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日龙虎榜行业方向分析 一…

卡洛诗,将高端西餐的冗余价值转化为普惠体验

西餐市场正经历一场结构性变革&#xff0c;一二线城市的高端西餐陷入内卷&#xff0c;而下沉市场却因品质与价格断层陷入选择困境——消费者既不愿为高价西餐的面子溢价买单&#xff0c;又难以忍受快餐式西餐的粗糙体验。这一矛盾催生了万亿级的市场真空地带&#xff0c;萨莉亚…

Flutter在键盘的上方加一个完成按钮

有些情况下&#xff0c;输入框在输入键盘弹出后&#xff0c; 需要在键盘的上方显示一个toolbar &#xff0c; 然后 toolbar 上面一个完成按钮&#xff0c;点完成按钮把键盘关闭。 如图&#xff1a; 直接上代码&#xff0c;这样写的好处是&#xff0c;把 TextField 给封装了&…

SQL注入---05--跨站注入

1 权限说明 select * from mysql.user; 这里的Y表示我前面的命令权限为root&#xff0c;n表示不支持root权限 导致结果&#xff1a; 如果为root的话&#xff0c;我就可操作这些命令并且可以进行跨数据库攻击&#xff0c;但是如果不是高权限root就无法执行这些操作 2 root权限…

【免费分享】虚拟机VM(适用于 Windows)17.6.3

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/7c4da5cd2af64 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDkRRKc5OUVTauZezaiDEHA1?pwdpybg# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…