使用 `perf` 和火焰图(Flame Graph)进行性能分析
在现代软件开发中,性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 CPU 占用率异常高时,识别并优化性能瓶颈显得尤为重要。本文将详细介绍如何使用 Linux 下强大的性能分析工具 perf
以及火焰图(Flame Graph)来分析和优化高 CPU 占用的进程。
目录
- 前言
- 使用
perf
收集性能数据- 安装
perf
- 收集数据
- 安装
- 使用
perf report
分析数据- 基本使用
- 界面导航与操作
- 过滤与搜索
- 生成火焰图(Flame Graph)
- 安装 FlameGraph 工具
- 生成火焰图
- 分析火焰图
- 优化与验证
- 实用技巧与常见问题
- 总结
前言
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-common
和linux-tools-generic
是perf
工具所需的基础包。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
的交互界面主要包括以下部分:
- 标头信息(Header):显示基本信息,如采样总数、监控的事件类型(如 CPU cycles)、进程名称等。
- 汇总视图(Summary View):列出占用 CPU 最多的函数或模块,每行通常包含:
- Overhead (%):该函数消耗的 CPU 百分比。
- Shared Object:函数所属的共享库或可执行文件。
- Symbol:函数名或符号名称。
- 函数调用详情(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
生成火焰图
以下是生成火焰图的步骤:
-
导出
perf
事件数据:sudo perf script -i perf.data > out.perf
-
生成折叠的堆栈数据:
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
-
生成火焰图 SVG 文件:
./FlameGraph/flamegraph.pl out.folded > flamegraph.svg
-
查看火焰图:
使用浏览器打开
flamegraph.svg
文件,直观地查看火焰图。
分析火焰图
火焰图的每个“火焰”代表一个函数调用,宽度表示该函数消耗的 CPU 时间。堆叠的层级展示了函数调用的层级关系。通过分析火焰图,可以识别出哪些函数或调用链消耗了大量的 CPU 资源。
示例分析:
假设火焰图中,compute_heavy_task
宽度较大,表示其占用了大量 CPU 时间。深入查看该函数的调用栈,可以发现其调用了 helper_function1
和 calculate
,进一步优化这些子函数可能会显著降低整体 CPU 占用率。
优化与验证
在识别出性能瓶颈后,进行针对性的代码优化:
- 优化算法:改进耗时的算法,减少计算复杂度。
- 减少不必要的计算:避免重复计算或不必要的资源消耗。
- 提高并行度:利用多线程或并行计算,提高资源利用率。
- 缓存优化:优化内存访问,提高缓存命中率。
优化完成后,重复上述 perf
和火焰图的分析步骤,验证优化效果是否显著,确保 CPU 占用率得到有效降低。
实用技巧与常见问题
保持调试信息
为了确保 perf
能准确解析函数名和源代码位置,编译应用程序时应包含调试信息。例如,使用 gcc
编译时添加 -g
选项:
gcc -g -o myapp myapp.c
处理容器化环境中的符号问题
当在容器中运行应用程序时,perf
可能无法正确解析容器内部的符号,导致“Unregistered symbol…”错误。解决方法如下:
-
确定容器的 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 路径。
- Device Mapper 类型:
-
使用
--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
-
继续生成火焰图:
./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 占用进程的性能数据,并结合火焰图进行直观的可视化分析。通过识别热点函数和调用关系,针对性地进行代码优化,可以显著提升应用程序的性能表现。
工作流程总结:
- 收集性能数据:使用
perf record
监控目标进程,生成perf.data
。 - 分析数据:使用
perf report
查看热点函数和调用关系。 - 生成火焰图:通过
perf script
和 FlameGraph 工具生成火焰图,直观分析。 - 优化代码:根据分析结果优化代码,降低 CPU 占用。
- 验证效果:重新进行性能分析,确认优化效果。
通过不断迭代这一过程,您可以逐步优化应用程序,提升其性能和稳定性。
相关文章:
使用 `perf` 和火焰图(Flame Graph)进行性能分析
在现代软件开发中,性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 CPU 占用率异常高时,识别并优化性能瓶颈显得尤为重要。本文将详细介绍如何使用 Linux 下强大的性能分析工具 perf 以及火焰图(Flame Graph)…...

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

实验6 电子邮件
实验6 电子邮件 1、实验目的 理解电子邮件系统基本结构 理解客户端和服务器端,以及服务器之间的通信 分析理解SMTP,POP3协议 2、实验环境 硬件要求:阿里云云主机ECS 一台。 软件要求:Linux/ Windows 操作系统 3、实验内容…...
AI大模型从0到1记录学习numpy pandas day24
第 1 章 环境搭建 1.1 Anaconda 1.1.1 什么是Anaconda Anaconda官网地址:https://www.anaconda.com/ 简单来说,Anaconda Python 包和环境管理器(Conda) 常用库 集成工具。它适合那些需要快速搭建数据科学或机器学习开发环境的用…...

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

大模型浪潮下,黑芝麻智能高性能芯片助力汽车辅助驾驶变革
在全球汽车产业向智能化、网联化加速转型的浪潮中,大模型技术的崛起为汽车领域带来了前所未有的变革机遇。黑芝麻智能在高性能芯片和基础软件架构领域的持续创新,正全力推动汽车智能化的发展,为行业注入新的活力。 大模型全面助力辅助驾驶迈…...
鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp
使用UniApp制作多选框与单选框组件 前言 在移动端应用开发中,表单元素是用户交互的重要组成部分。尤其是多选框(Checkbox)和单选框(Radio),它们几乎存在于每一个需要用户做出选择的场景中。虽然UniApp提供…...

康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX
目录 一、OpenDRIVE:兼容多版本地图标准 (1)Atlas 工作流 (2)UE Plugin 工作流 二、OpenSCENARIO:标准化动态行为建模 三、OpenCRG:还原毫米级路面细节 四、OpenMATERIAL:更真…...
VMware中快速安装与优化Ubuntu全攻略
准备工作 在开始安装之前,确保已经下载了VMware Workstation或VMware Player,并准备好Ubuntu的ISO镜像文件。VMware Workstation是一款功能强大的虚拟机软件,支持在Windows或Linux主机上运行多个操作系统。 创建虚拟机 打开VMware Worksta…...

GPUGeek云平台实战:DeepSeek-R1-70B大语言模型一站式部署
随着人工智能技术的迅猛发展,特别是在自然语言处理领域,大型语言模型如DeepSeek-R1-70B的出现,推动了各行各业的变革。为了应对这些庞大模型的计算需求,云计算平台的普及成为了关键,特别是基于GPU加速的云平台…...
无人机动力系统全解析:核心组件、工作原理与实用指南
无人机想要实现稳定飞行与灵活操控,离不开一套高效协同的动力系统。该系统以电机、电子调速器(电调)、电池和螺旋桨四大核心组件为基础,各部分精密配合,共同驱动无人机翱翔蓝天。接下来,本文将从基础原理入…...

【C语言】初阶数据结构相关习题(二)
🎆个人主页:夜晚中的人海 今日语录:知识是从刻苦劳动中得来的,任何成就都是刻苦劳动的结果。——宋庆龄 文章目录 🎄一、链表内指定区间翻转🎉二、从链表中删去总和值为零的节点🚀三、链表求和&…...

嵌入式学习--江科大51单片机day7
我们在听课的过程中,可能对老师讲的有疑问,或者有些自己的理解,我们可以去问豆包,包括在写博客的时候我也是,不断去问豆包保证思考的正确性。(有人感觉豆包很low啊,其实这些基础性的东西豆包一般…...
基于大模型预测围术期麻醉苏醒时间的技术方案
目录 一、数据收集与处理(一)数据来源(二)数据预处理二、大模型构建与训练(一)模型选择(二)模型训练三、围术期麻醉苏醒时间预测(一)术前预测(二)术中动态预测四、并发症风险预测(一)风险因素分析(二)风险预测模型五、基于预测制定手术方案(一)个性化手术规划…...

Element Plus 取消el-form-item点击触发组件,改为原生表单控件
文章目录 问题:方法一:使用全局样式覆盖(推荐)方法二:自定义指令(更灵活)方法三:封装高阶组件方法四:运行时DOM修改(不推荐) 问题: 描…...
javascript —— ! 和 !! 的区别与作用
javascript —— ! 和 !! 的区别与作用 在 JavaScript 里,! 和 !! 是两种不同的逻辑运算符,它们的功能和使用场景有明显区别。 1、 !(逻辑非运算符) 它的主要作用是 对操作数进行布尔值取反。具体来说,就是 先把操作…...
鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集
ArkUI 组件速查表 鸿蒙应用开发页面上需要实现的 UI 功能组件如果在这 100 多个组件里都找不到,那就需要组合造轮子了 使用技巧:先判断需要实现的组件大方向,比如“选择”、“文本”、“信息”等,或者是某种形状比如“块”、“图…...
LLM笔记(三)位置编码(1)
位置编码理论与应用 1. 位置编码如何解决置换不变性及其数学表现 在Transformer模型中,自注意力机制(Self-Attention)具有置换不变性(permutation invariance),这意味着对输入序列的词元(toke…...
麒麟v10 部署 MySQL 5.6.10 完整步骤
需要包的私信我 一、安装依赖(Perl环境) # 在线安装依赖 yum -y install perl perl-devel# 离线安装(需提前下载好rpm包) mkdir /data/ybn/soft/pre yum install --downloadonly --downloaddir/data/ybn/soft/pre perl perl-dev…...

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

专项智能练习(定义判断)
1. 单选题 热传导是介质内无宏观运动时的传热现象,其在固体、液体和气体中均可发生。但严格而言,只有在固体中才是纯粹的热传导,在流体(泛指液体和气体)中又是另外一种情况,流体即使处于静止状态ÿ…...
失控的产品
大部分程序员很难有机会做一个新的产品,绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会,从2023年开始做,中间经历了许多磕磕碰碰。 有的小伙伴从中离开,偶尔又加入1~2个人,但…...

【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error
Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考:https://www.bilibili.com/opus/977469285985157129 A9 - A11(iPhone6s-X):iOS15.0-16.6.1 A12-A14(iPhoneXR-12PM…...
无线定位之 二 SX1302 网关源码 thread_down 线程详解
前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

对心理幸福感含义的探索 | 幸福就是一切吗?
注:机翻,未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗?对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …...
多平台图标设计与管理的终极解决方案
IconWorkshop Pro 是一款由Axialis团队开发的专业图标设计与制作软件,专注于为设计师、开发者及企业用户提供高效且灵活的图标创作解决方案。该软件凭借其强大的功能与跨平台适配性,成为Windows、macOS、iOS、Android等多系统图标设计的首选工具之一。 …...
ngx_http_keyval_module动态键值管理
一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module,说明模块已编译进 NGINX。 若未找到,请联系你的 NGINX 供应商,获取商业版或重新编译并启用该模块&am…...

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

讯联云库项目开发日志(二)AOP参数拦截
目录 利用AOP实现参数拦截: 一、HTTP请求进入Controller(发送邮件验证码) 二、AOP切面触发 1. 切面拦截(GlobalOperactionAspect.class) method.getAnnotation() null interceptor 判断 2.参数校验注解 3. 参…...

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