当前位置:首页>Linux>Linux 性能问题排查利器——Perf 与 Flame Graph 全流程实践

Linux 性能问题排查利器——Perf 与 Flame Graph 全流程实践

  • 2026-09-18 11:12:52
Linux 性能问题排查利器——Perf 与 Flame Graph 全流程实践

1、简介

Perf 是 Linux 内核自带的高性能分析工具,通过硬件性能计数器(PMU)和内核采样机制,对系统、进程及线程的运行状态进行实时采样和统计分析,能够深入观察 CPU、内存、调度、缓存等关键性能指标。与 top、ps 等只能展示资源使用情况的工具不同,Perf 不仅能够发现“哪个进程占用了大量 CPU”,更能够精确定位“哪个函数或代码路径消耗了最多的 CPU 时间”。凭借其强大的性能剖析能力,Perf 已成为 Java、Go、C/C++ 等应用性能优化,以及 Kubernetes、数据库和操作系统级故障诊断与性能调优中最常用的工具之一。

2、特点

  • Linux 原生性能分析工具:Perf 是 Linux 内核自带的性能分析框架,无需额外安装即可使用,与操作系统深度集成,性能开销较低。

  • 基于采样机制,适合生产环境:通过周期性采样获取程序运行状态,对业务影响较小,能够在生产环境中进行性能分析和问题定位。

  • 支持完整调用链分析:可以记录函数调用栈(Call Stack),帮助开发和运维人员快速定位性能热点及代码瓶颈。

  • 覆盖应用层到内核层:不仅能够分析应用程序性能,还可以分析系统调用、内核函数、调度行为等底层运行情况。

  • 支持可视化性能分析:可与 Flame Graph(火焰图)等工具结合,将性能数据以图形化方式展示,提升问题分析效率。

3、使用场景

  • CPU 使用率过高问题排查:当服务器或应用出现 CPU 持续飙高时,通过 Perf 快速定位具体消耗 CPU 的函数和代码路径。

  • 应用性能优化:适用于 Java、Go、C/C++ 等应用程序的性能分析,发现热点函数、低效算法及资源消耗瓶颈。

  • Kubernetes 与云原生环境诊断:用于分析 Kubernetes 节点、容器或微服务的性能问题,定位高负载进程和异常资源消耗。

  • 数据库及中间件性能分析:针对 MySQL、PostgreSQL、Redis 等组件进行性能剖析,发现查询、锁竞争或系统资源瓶颈。

  • 故障排查与性能可视化:结合 Flame Graph 生成火焰图,用于故障复盘、性能评审、技术分享以及系统优化过程中的可视化分析。

4、工作原理

# Perf 的本质是:周期性地对程序进行采样(Sampling)perf record -F99-g-p22250--sleep30
参数说明
-F 99每秒采样99次
-g记录调用栈
-p指定PID
sleep 30持续采样30秒

假设程序执行

main() └─ taskA()     └─ taskB()         └─ taskC()

Perf 每次采样时会记录

maintaskAtaskBtaskC

经过几千次采样后

taskC 出现 6000 次taskB 出现 2000 次taskA 出现 500 次

说明

taskC 最耗CPU

5、核心命令

perf record

# 负责采集性能数据perf record -F99-g-p22250--sleep30# 执行后会生成文件perf.data# 类似抓包产生的:tcpdump.pcap

perf report

# 负责查看热点函数[root@master test]# perf report或:[root@master test]# perf report --stdioOverhead  Command  Symbol45.12%    java     Hot.main20.35%    java     compute15.67%    java     sqrt

含义

CPU 45% 时间花在 Hot.mainCPU 20% 时间花在 computeCPU 15% 时间花在 sqrt

<!--这是定位性能问题最快的方法。-->


perf script

Perf Script 会把二进制采样数据展开成文本格式。

# Perf Script 会把二进制采样数据展开成文本格式perf script > out.perf

生成:

java 22250 [001] ... Hot.main compute sqrt

<!--Flame Graph 使用,所以 perf report是给人看的。而perf script是给后续工具处理的。-->

6、perf report 与 perf script 的区别

perf report和perf script# 它们都读取perf.data:区别只是展示方式不同。

perf report

统计分析模式

Top N 热点函数50% Hot.main20% compute15% sqrt

适合:

  • 快速定位热点

  • 找CPU瓶颈


perf script

完整调用栈模式

main └── compute      └── sqrt

适合:

  • Flame Graph

  • 调用链分析

7、分析事例

采集整机

# 采样整个机器perf record -F99-gsleep30

包含:

  • Java

  • MySQL

  • Redis

  • Docker

  • Kernel

所有进程。


采样进程

# 只分析PID=22250perf record -F99-g-p22250--sleep30

8、使用 Flame Graph 可视化性能热点

# 下载工具cd /optgit clone https://github.com/brendangregg/FlameGraph.git# 采样perf record -F99-g-p <pid> --sleep30# 查看热点perf report --stdio# 导出调用栈perf script > out.perf# 折叠调用栈stackcollapse-perf.pl out.perf > out.folded# 生成火焰图flamegraph.pl out.folded > flame.svg

9、如何看懂火焰图?

  • 宽度:宽度越宽,耗时越多 

  • 高度:盖度越高,调用层次越深

✨ 只写原创,不接广告,不接广告,不接广告。

在这里,你将看到全新的技术分享、运维经验、以及最新的行业动态。我们坚信,原创内容才是最有价值的资源,所以所有文章都是独立创作,与你们一起成长。

💡 下期想学习什么技术?

如果你有任何学习需求或者感兴趣的技术话题,欢迎私信告诉我!我会根据大家的反馈选择下期的内容,帮助你们提升技能。

🌟 运维知识星球

我也创建了一个运维知识星球,专注于分享大量运维、开发和技术管理方面的原创文章、教程、工具和经验。如果你对技术有浓厚兴趣,欢迎加入我们!一起交流、一起进步!

最新文章

随机文章