火焰图(Flame Graph) 是一种可视化性能分析工具,可以帮助你快速定位 CPU、内存或 I/O 瓶颈。它看起来像火焰,因此得名。

  1. 火焰图能解决什么问题?
  • CPU 占用高:找出哪些函数消耗了最多的 CPU 时间。
  • 程序卡顿:分析代码执行路径,找到慢速操作。
  • 线程阻塞:查看哪些线程在等待锁或 I/O。
  • 内存泄漏(需配合内存分析工具)。

  1. 准备工作

    Linux / macOS

安装 perf(Linux 性能分析工具)

sudo apt install linux-tools-common linux-tools-generic # Ubuntu/Debian

sudo yum install perf # CentOS/RHEL

安装 FlameGraph 脚本

git clone https://github.com/brendangregg/FlameGraph.git

cd FlameGraph

export PATH=$PATH:$(pwd) # 临时添加到 PATH

3. 生成 CPU 火焰图(以 Java 为例)

(1)采集数据

方法 1:使用 perf(推荐,适用于 Linux)

1. 找到 Java 进程 ID

jps # 或 ps -ef | grep java

2. 采集 CPU 调用栈(采样 30 秒)

sudo perf record -F 99 -p -g -- sleep 30

3. 生成火焰图

perf script | stackcollapse-perf.pl | flamegraph.pl > flamegraph.svg

方法 2:使用 async-profiler(更简单,支持 Java)

下载 async-profiler

wget https://github.com/jvm-profiling-tools/async-profiler/releases/download/v2.9/async-profiler-2.9-linux-x64.tar.gz

tar -xzf async-profiler-.tar.gz

cd async-profiler-

采集 CPU 数据(采样 30 秒)

./profiler.sh -d 30 -f flamegraph.svg

(2)查看火焰图

生成的 flamegraph.svg 可以用浏览器打开:

firefox flamegraph.svg # 或 chrome, edge

4. 如何读懂火焰图?

火焰图结构

  • Y 轴(高度):调用栈深度(越深表示调用链越长)。
  • X 轴(宽度):函数执行时间占比(越宽表示占用 CPU 越多)。
  • 颜色:无特殊含义,仅用于区分不同函数。

    关键操作

    操作

    说明

    鼠标悬停

    显示函数名、CPU 占比

    点击放大

    查看某个函数的详细调用链

    搜索(Ctrl+F)

    查找特定函数(如 java.lang.Thread.sleep)

    [图片]

  1. 常见问题

    (1)火焰图显示 [unknown] 怎么办?
  • 原因:缺少调试符号(如 JVM 未启用 -XX:+PreserveFramePointer)。
  • 解决方案:

Java 运行时添加参数

java -XX:+PreserveFramePointer -jar your_app.jar

或者使用 async-profiler 的 --all-user 选项

./profiler.sh --all-user -d 30 -f flamegraph.svg

(2)如何分析内存泄漏?

改用 内存火焰图(需 async-profiler):

./profiler.sh -d 30 -e alloc -f mem_flamegraph.svg

6. 进阶用法

场景

命令

分析锁竞争

./profiler.sh -e lock -d 30 -f lock.svg

分析 I/O 等待

perf record -e 'sched:sched_stat_iowait' -p -g -- sleep 10

生成差分火焰图

diff two_flamegraphs.svg

7. 总结

  1. 安装工具:perf + FlameGraph 或 async-profiler。
  2. 采集数据:perf record 或 ./profiler.sh -d 30。
  3. 生成 SVG:flamegraph.pl 转换数据。

火焰图(Flame Graph)使用指南的更多相关文章

  1. perf + 火焰图用法 小结

    要对新服务做性能测试,分析代码热点,初识perf,做下总结 perf + 火焰图用法 perf简介 Perf (Performance Event), Linux 系统原生提供的性能分析工具, 会返回 ...

  2. Linux下用火焰图进行性能分析【转】

    转自:https://blog.csdn.net/gatieme/article/details/78885908 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  3. 火焰图工具 SystemTap

    1. 安装 SystemTap 1. 首先安装内核开发包和调试包: # rpm -ivh kernel-debuginfo-common-($version).rpm # rpm -ivh kerne ...

  4. 使用perf生成Flame Graph(火焰图)

      具体的步骤参见这里: <flame graph:图形化perf call stack数据的小工具>   使用SystemTap脚本制作火焰图,内存较少时,分配存储采样的数组可能失败,需 ...

  5. perf + Flame Graph火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  6. linux系统分析工具续-SystemTap和火焰图(Flame Graph)

    本文为网上各位大神文章的综合简单实践篇,参考文章较多,有些总结性东西,自认暂无法详细写出,建议读文中列出的参考文档,相信会受益颇多.下面开始吧(本文出自 “cclo的博客” 博客,请务必保留此出处ht ...

  7. [失败]SystemTap和火焰图(Flame Graph)

    本文参考http://blog.51cto.com/xuclv/1184517 SystemTap简介: SystemTap provides free software (GPL) infrastr ...

  8. 火焰图(Flame Graphs)的安装和基本用法

    火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原 ...

  9. 动态追踪技术(中) - Dtrace、SystemTap、火焰图

    http://openresty.org/cn/presentations.html http://weibo.com/agentzh?is_all=1 http://openresty.org/po ...

  10. 使用Flame Graph进行系统性能分析

    关键词:Flame Graph.perf.perl. FlameGraph是由BrendanGregg开发的一款开源可视化性能分析工具,形象的成为火焰图. 从底向上像火苗一样逐渐变小,也反映了相互之间 ...

随机推荐

  1. 项目PMP之十项目沟通管理

    项目PMP之十--项目沟通管理   一.定义:通过正式或非正式途径信息有效交换获取想法.指示或情绪:向大家说明项目进度现状(即工作绩效报告) 成功的沟通:适合的沟通策略:信息传递需要恰当:理解正确:筛 ...

  2. java中的文件流File

    数据 + 流(转)操作 IO I表示的是:输入Input O表示的是:Output Stream表示流转 java中的管道不止一个.并且管道有可能不是一样的. 有的管道粗有的管道细 File的常用方法 ...

  3. S3基准测试工具 - Warp使用简介

    本文分享自天翼云开发者社区<S3基准测试工具 - Warp使用简介>,作者:y****n 1.Warp⼯具简介 warp 是⼀款开源的S3基准测试⼯具,开源S3项⽬minio下的⼀个⼦项⽬ ...

  4. CMW500 Bluetooth信令测试

    一.简介 R&SCMW500宽带无线通信测试仪是适用于射频集成和协议开发的通用测试平台,其内部集成RF功率计和带List模式的CW发生器,可以完成无线设备的快速校准:同时还集成了矢量信号分析仪 ...

  5. [记录点滴] OpenResty中Redis操作总结

    [记录点滴] OpenResty中Redis操作总结 0x00 摘要 本文总结了在OpenResty中的操作,与大家分享,涉及知识点为Openresty, Lua, Redis. 0x01 操作记录 ...

  6. css快速入门系列 —— 移动开发闲谈

    移动开发闲谈(Flex和css 库) 背景 目前在做移动小程序开发,效果必须和设计稿一模一样,一个像素都不能有差异. 虽然公司也提供了图生文的工具,但是有时生成的代码可读性不太好,二次修改也比较费劲, ...

  7. 《Indie Tools • 半月刊》第001期

    引言:独立开发者工具分享 <INDIE TOOLS>专注于分享独立开发出海精选.最新.最实用的工具. 欢迎订阅半月刊:<INDIE TOOLS • 半月刊> 如果本文能给你提供 ...

  8. ssh远程连接linux服务器

    Linux,ssh远程连接 一. linux端配置 1.安装ssh服务 sudo apt-get update sudo apt-get install openssh-client sudo apt ...

  9. 洛谷P11380 [GESP202412 八级] 排队 题解

    数据太可恶了,竟然有重边!!! 题目传送门. 显然一道简单图论题. 把 \(a_i\) 和 \(b_i\) 的关系想象成一条有向边,于是可以得出:如果 \(x\) 的出度大于 \(1\) 或者 \(x ...

  10. TypeError: 'NoneType' object is not iterable 一次错误场景

    TypeError: 'NoneType' object is not iterable 源码 def get_url(lines): urls=[] for line in lines: if 'i ...