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

使用 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

http://www.jsqmd.com/news/263036/

相关文章:

  • 深度测评10个AI论文写作软件,研究生高效写作必备!
  • 基于深度学习和熔池图像对的焊缝熔透状态识别【附代码】
  • 导入自己的听歌时长数据,统计每周听歌总时长,输出音乐风格偏好分析。
  • python基于Web技术的智能养老管理系统
  • python基于大数据文化产业发展智能分析系统
  • MySQL面试中,锁机制必问的5大问题!
  • Questions for the Technical Advisory Board - 2
  • 前馈/反馈控制是什么
  • 2025年市面上有实力的尘埃粒子计数器源头厂家排行榜,在线式粒子计数器/尘埃粒子检测仪供应厂家电话 - 品牌推荐师
  • 2025年市场技术好的楼板搭建公司推荐,现浇楼梯/楼板现浇/钢筋混凝土现浇/现浇搭建/楼梯现浇,楼板搭建报价口碑推荐 - 品牌推荐师
  • 小程序 智能ai技术的基于Spring Boot的宠物(狗)健康管理的设计与实现
  • 全网最全自考必看!10款AI论文工具测评TOP10
  • 【开题答辩全过程】以 基于微信小程序健康跑平台的设计与实现为例,包含答辩的问题和答案
  • python网络招聘信息分析系统的设计与实现 boss直聘 爬虫 技术的猎聘数据可视化分析
  • 【开题答辩全过程】以 基于Android的高校员工考勤系统的设计与实现为例,包含答辩的问题和答案
  • SKF轴承动力学仿真信号分析代码功能说明
  • URL地址末尾加不加”/“有什么区别
  • 珲春好吃的烤肉哪家好吃
  • AI数据报告产品在文旅景区运营中的实践与技术搭建
  • 四边形不等式相关
  • 【小程序毕设全套源码+文档】基于微信小程序的学生定位考勤系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设源码分享】基于springboot+微信小程序的面向小学生的阅读交流系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 2026 年水质检测仪采购清单:手持式、台式、固定式设备品牌全解析 - 品牌推荐大师1
  • 【小程序毕设源码分享】基于springboot+微信小程序的上门做菜预定服务平台的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 西门子S7-200smart PLC用RS485通讯读取绝对值伺服编码器当前位置程序,并将当前...
  • 汽车制造行业OA系统如何优化百度UE的跨平台截屏功能?
  • 2026工业展好评榜:哪些展会成为行业焦点?智能/机械/机床/传感器/仪器仪表/机器人/液压气动,工业展展会排行榜 - 品牌推荐师
  • 如何在 Linux 中使用 sort 命令排序 ?
  • 半监督深度学习网络在医疗图像处理中的研究
  • 金融风控平台如何通过百度富文本编辑器导入Word带图表格?