news 2026/4/16 14:26:07

使用 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/4/16 9:08:10

python大数据基于spark的旅游路线推荐系统 爬虫可视化系统

目录摘要关键词开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着旅游业的快速发展&#xff0c;个性化旅游路线推荐需求日益增长。基于Spark的大数据旅游路线推荐系统结合爬虫技术与…

作者头像 李华
网站建设 2026/4/16 0:46:23

URL地址末尾加不加”/“有什么区别

URL 结尾是否带 / 主要影响的是 服务器如何解析请求 以及 相对路径的解析方式&#xff0c;具体区别如下&#xff1a;1. 基础概念URL&#xff08;统一资源定位符&#xff09; &#xff1a;用于唯一标识互联网资源&#xff0c;如网页、图片、API等。目录 vs. 资源&#xff1a;以 …

作者头像 李华
网站建设 2026/4/16 5:08:05

汽车制造行业OA系统如何优化百度UE的跨平台截屏功能?

企业级文档导入与粘贴解决方案 项目需求分析 作为山东某国企项目负责人&#xff0c;我们面临以下核心需求&#xff1a; 文档处理功能增强&#xff1a; Word内容粘贴&#xff08;含图片自动上传&#xff09;Word/Excel/PPT/PDF文档导入&#xff08;保留复杂样式&#xff09;微…

作者头像 李华
网站建设 2026/4/15 21:08:14

【小程序毕设源码分享】基于springboot+微信小程序的学生定位考勤系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 9:20:45

Invicti Standard v26.1.0 for Windows - 企业级 Web 应用与 API 安全

Invicti Standard v26.1.0 for Windows - 企业级 Web 应用与 API 安全 Invicti (formerly Netsparker) | Web Application and API Security for Enterprise 请访问原文链接&#xff1a;https://sysin.org/blog/invicti/ 查看最新版。原创作品&#xff0c;转载请保留出处。 …

作者头像 李华
网站建设 2026/4/16 11:04:11

2026必备!9个AI论文工具,专科生轻松搞定毕业论文!

2026必备&#xff01;9个AI论文工具&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何改变论文写作的未来 随着人工智能技术的飞速发展&#xff0c;越来越多的学生开始借助 AI 工具来提升论文写作的效率和质量。尤其是对于专科生而言&#xff0c;面对繁重的学业压力…

作者头像 李华