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 每次采样时会记录
main
taskA
taskB
taskC
经过几千次采样后
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 –stdio
Overhead Command Symbol

45.12% java Hot.main
20.35% java compute
15.67% java sqrt
含义
CPU 45% 时间花在 Hot.main
CPU 20% 时间花在 compute
CPU 15% 时间花在 sqrt

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

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

perf script > out.perf
生成:

java 22250 [001] …
Hot.main
compute
sqrt

6、perf report 与 perf script 的区别
perf report

perf script

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

perf report
统计分析模式

Top N 热点函数
50% Hot.main
20% compute
15% sqrt
适合:

快速定位热点

找CPU瓶颈

perf script
完整调用栈模式

main
└── compute
└── sqrt
适合:

Flame Graph

调用链分析

7、分析事例
采集整机

采样整个机器

perf record -F99-gsleep30
包含:

Java

MySQL

Redis

Docker

Kernel

所有进程。

采样进程

只分析PID=22250

perf record -F99-g-p22250–sleep30
8、使用 Flame Graph 可视化性能热点

下载工具

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

采样

perf record -F99-g-p –sleep30

查看热点

perf report –stdio

导出调用栈

perf script > out.perf

折叠调用栈

stackcollapse-perf.pl out.perf > out.folded

生成火焰图

flamegraph.pl out.folded > flame.svg
9、如何看懂火焰图?
宽度:宽度越宽,耗时越多

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

火焰图 · OpenResty最佳实践

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

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

💡 下期想学习什么技术?

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

🌟 运维知识星球

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

声明:来自IT运维大爆炸,仅代表创作者观点。链接:https://eyangzhen.com/8692.html

IT运维大爆炸的头像IT运维大爆炸

相关推荐

添加微信
添加微信
Ai学习群
返回顶部