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
适合:
perf script
完整调用栈模式
main └── compute └── sqrt
适合:
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、如何看懂火焰图?
宽度:宽度越宽,耗时越多
高度:盖度越高,调用层次越深

✨ 只写原创,不接广告,不接广告,不接广告。
在这里,你将看到全新的技术分享、运维经验、以及最新的行业动态。我们坚信,原创内容才是最有价值的资源,所以所有文章都是独立创作,与你们一起成长。
💡 下期想学习什么技术?
如果你有任何学习需求或者感兴趣的技术话题,欢迎私信告诉我!我会根据大家的反馈选择下期的内容,帮助你们提升技能。
🌟 运维知识星球
我也创建了一个运维知识星球,专注于分享大量运维、开发和技术管理方面的原创文章、教程、工具和经验。如果你对技术有浓厚兴趣,欢迎加入我们!一起交流、一起进步!