news 2026/5/10 17:54:35

使用 perf + FlameGraph 生成火焰图(Flame Graph)笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 perf + FlameGraph 生成火焰图(Flame Graph)笔记

使用 perf + FlameGraph 生成火焰图(Flame Graph)笔记

  • 使用 perf + FlameGraph 生成火焰图(Flame Graph)笔记
    • 一、什么是火焰图(Flame Graph)
      • 火焰图的核心含义
    • 二、整体流程概览
    • 三、准备环境
      • 1️⃣ 安装 perf
      • 2️⃣ 下载 FlameGraph 工具
    • 四、Step 1:使用 perf record 采样 CPU
      • perf 是什么?
      • 采样频率说明(99Hz)
      • 示例命令
      • 结束采样
    • 五、Step 2:解析 perf.data(perf script)
      • 输出说明
    • 六、Step 3:折叠调用栈(stack collapse)
      • 执行命令
      • 折叠后的格式
    • 七、Step 4:生成火焰图 SVG
    • 八、Step 5:分析火焰图
      • 打开方式
      • 关键分析技巧
        • 1️⃣ 找最宽的函数
        • 2️⃣ 看“平顶山”
        • 3️⃣ 从下往上看调用路径
        • 4️⃣ 使用搜索功能
    • 九、常见问题与建议
      • 1️⃣ 为什么一定要 `-g`?
      • 2️⃣ cpu-clock vs cycles
      • 3️⃣ 生产环境是否安全?
    • 十、总结

使用 perf + FlameGraph 生成火焰图(Flame Graph)笔记

参考项目: https://github.com/brendangregg/FlameGraph
适用场景:Linux 服务器 CPU 性能分析、热点函数定位、性能瓶颈排查


一、什么是火焰图(Flame Graph)

火焰图是一种CPU 采样分析可视化图表,用于直观展示:

  • 程序在CPU 上花时间最多的函数
  • 函数的调用栈关系
  • 哪些路径是性能瓶颈(Hot Path)

火焰图的核心含义

  • 横轴(X 轴):CPU 时间占比(越宽表示耗时越多)
  • 纵轴(Y 轴):调用栈深度(越高表示调用层级越深)
  • 颜色:仅用于区分函数,无实际性能含义

🔥 顶部最宽的“平顶”函数,往往就是性能瓶颈


二、整体流程概览

生成火焰图通常分为5 个步骤

  1. 使用perf record采集 CPU 采样数据
  2. 生成原始调用栈文本(perf script
  3. 折叠调用栈(stack collapse)
  4. 生成 SVG 火焰图
  5. 用浏览器分析火焰图

流程示意:

perf record ↓ perf.data ↓ perf script ↓ perf.unfold ↓ stackcollapse-perf.pl ↓ perf.folded ↓ flamegraph.pl ↓ xxx.svg

三、准备环境

1️⃣ 安装 perf

perf是 Linux 内核自带工具(kernel tools),执行perf --version查看版本,若不存在perf命令,则执行如下命令进行安装:

yuminstall-y perf# 或dnfinstall-y perf

确认版本:

perf --version

2️⃣ 下载 FlameGraph 工具

gitclone https://github.com/brendangregg/FlameGraph.gitcdFlameGraph

主要会用到两个脚本:

  • stackcollapse-perf.pl
  • flamegraph.pl

四、Step 1:使用 perf record 采样 CPU

perf 是什么?

perfLinux 原生性能分析工具(performance 的缩写),可以:

  • 采集 CPU 正在执行的函数
  • 记录函数调用栈(stack trace)
  • 通过采样方式分析性能开销

采样频率说明(99Hz)

默认情况下:

  • 每秒采样 99 次(99Hz)
  • 如果 99 次采样都命中同一个函数
  • 说明这一秒 CPU 几乎都在执行这个函数 👉 很可能是性能瓶颈

示例命令

perf record -e cpu-clock -g -p28591--sleep60

参数解释:

参数含义
-e cpu-clock以 CPU 时钟作为采样事件(通用、稳定)
-g记录调用栈(非常关键)
-p 28591指定进程 PID(主 DN 进程号)
sleep 60持续采样 60 秒

⏱ 一般30~60 秒就足够定位 CPU 热点

结束采样

  • 采样期间可以Ctrl + C提前结束
  • 当前目录会生成文件:
perf.data

五、Step 2:解析 perf.data(perf script)

使用perf script将二进制采样数据转换为文本调用栈:

perf script -i perf.data&>perf.unfold

输出说明

  • perf.unfold中包含:

    • 每一次采样的
    • 完整函数调用栈(从栈顶到栈底)

示例(简化):

java Interpreter JVM_Invoke syscall

六、Step 3:折叠调用栈(stack collapse)

火焰图要求将相同调用路径进行合并统计

执行命令

./stackcollapse-perf.pl perf.unfold&>perf.folded

折叠后的格式

main;foo;bar 120 main;foo;baz 30

含义:

  • main → foo → bar这条调用路径
  • 被采样120 次

七、Step 4:生成火焰图 SVG

./flamegraph.pl perf.folded>cn.svg

生成结果:

  • cn.svg:标准火焰图文件

八、Step 5:分析火焰图

打开方式

  • 直接用浏览器打开:
cn.svg

关键分析技巧

1️⃣ 找最宽的函数
  • 宽度 = CPU 时间占比
  • 越宽,越值得优化
2️⃣ 看“平顶山”
  • 火焰图顶部的一大片函数
  • 往往是性能瓶颈最终落点
3️⃣ 从下往上看调用路径
  • 底部:入口函数(如 main / 线程函数)
  • 顶部:最终耗 CPU 的函数
4️⃣ 使用搜索功能
  • 点击右上角 🔍
  • 输入函数名 / 模块名

九、常见问题与建议

1️⃣ 为什么一定要-g

  • 没有-g→ 只能看到函数耗时
  • -g→ 才能看到调用链(根因分析)

2️⃣ cpu-clock vs cycles

事件说明
cpu-clock与 CPU 频率无关,推荐
cycles与硬件相关,受频率影响

👉通用分析优先用cpu-clock

3️⃣ 生产环境是否安全?

  • perf 属于采样分析
  • 对性能影响很小(通常 <5%)
  • 适合线上问题定位(建议短时间)

十、总结

一句话总结:

perf 负责采样,FlameGraph 负责可视化,火焰图让 CPU 热点一眼可见。

核心命令回顾:

perf record -e cpu-clock -g -p<PID>--sleep60perf script -i perf.data&>perf.unfold ./stackcollapse-perf.pl perf.unfold&>perf.folded ./flamegraph.pl perf.folded>result.svg

若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/157093811

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 19:27:37

基于单像素成像和深度学习的光学图像加密研究【附源码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅成品或者定制&#xff0c;扫描文章底部微信二维码。(1) 基于单像素成像与未训练神经网络的光学图像隐写术信息安全领域中&#xff0c;图像…

作者头像 李华
网站建设 2026/5/10 17:53:44

视觉SLAM位姿估计深度学习技术应用【附完整代码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅成品或者定制&#xff0c;扫描文章底部微信二维码。&#xff08;1&#xff09;基于多平面分割的位姿求解方法 在视觉SLAM系统中&#xff…

作者头像 李华
网站建设 2026/5/3 8:39:02

python基于Web技术的智能养老管理系统

目录基于Web技术的智能养老管理系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Web技术的智能养老管理系统摘要 随着人口老龄化加剧&#xff0c;传统养老模式面临资源分配不均、…

作者头像 李华
网站建设 2026/5/2 22:56:51

互联网大厂Java求职面试实战:涵盖Spring Boot、微服务与AI技术的全栈问答

互联网大厂Java求职面试实战&#xff1a;涵盖Spring Boot、微服务与AI技术的全栈问答 场景背景 在一家互联网大厂的Java开发岗位面试中&#xff0c;严肃且专业的面试官与幽默搞笑的水货程序员谢飞机展开了3轮技术问答。面试内容涵盖从核心Java语言、Spring生态、数据库ORM&…

作者头像 李华
网站建设 2026/5/3 4:51:17

自监督学习让医疗视频分析准确率翻倍

&#x1f4dd; 博客主页&#xff1a;Jax的CSDN主页 自监督学习&#xff1a;医疗视频分析准确率的革命性跃升目录自监督学习&#xff1a;医疗视频分析准确率的革命性跃升 目录 引言&#xff1a;医疗视频分析的瓶颈与突破 自监督学习的技术内核&#xff1a;从数据饥渴到高效学习 …

作者头像 李华
网站建设 2026/5/9 15:24:56

基于SpringBoot的箱包存储系统毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的箱包存储系统&#xff0c;以满足现代物流行业中对于高效、智能、安全存储管理的需求。具体研究目的如下&#xff…

作者头像 李华