Linux perf 是 Linux 内核内置的性能分析工具(全称 Performance Counters for Linux),它直接利用 CPU 的性能监控单元(PMU)和内核跟踪点,提供低开销、高精度的性能数据采集能力,无论是分析 CPU 瓶颈、内存访问、函数调用关系还是系统调用,perf 都是 Linux 性能调优的核心工具,下面从安装到实战详细说明其使用方法:
安装与基础准备
安装 perf
不同 Linux 发行版安装命令:
# CentOS/RHEL sudo yum install perf # Arch/Manjaro sudo pacman -S perf
权限配置
部分功能需 root 权限或调整内核参数:
# 允许非 root 用户使用(需重启生效) echo kernel.perf_event_paranoid=1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p
权限值说明:
-1
:无限制0
:允许内核分析(默认)1
:允许用户态分析(推荐)2
:仅基础计数
核心命令详解(附常用场景)
perf stat
:实时统计事件
统计程序运行期间的 CPU 周期、缓存命中率等硬件事件:
# 统计 ls 命令的执行事件 perf stat ls # 统计特定进程(PID=1234)的 L1 缓存命中率 perf stat -e L1-dcache-load-misses,L1-dcache-loads -p 1234
常用事件:
cpu-cycles
:CPU 周期数cache-misses
:缓存未命中次数instructions
:指令数(结合 cycles 计算 IPC)context-switches
:上下文切换次数
perf record
+ perf report
:采样分析
Step 1:采集数据(生成 perf.data
)
# 监控整个系统 10 秒 sudo perf record -a -g -- sleep 10 # 监控指定进程(PID=1234),采样 CPU 使用 perf record -F 99 -p 1234 -g -- sleep 30
关键参数:
-F 99
:每秒采样 99 次(平衡精度与开销)-g
:记录调用栈(生成火焰图必备)-a
:监控所有 CPU
Step 2:生成报告
perf report --stdio # 文本模式查看 perf report --tui # 交互式界面(推荐)
报告解读:
- Overhead:该函数在采样中占比(性能热点)
- Command:进程名
- Shared Object:所属模块(如 libc.so, [kernel])
perf top
:实时性能热力图
类似 top
命令的动态视图,实时显示消耗 CPU 的函数:
sudo perf top -g -F 1000 # 每秒采样 1000 次,显示调用栈
按
E
调整事件类型,按 / 折叠展开调用栈。
perf trace
:系统调用追踪
替代 strace
的低开销系统调用分析:
# 追踪进程 1234 的所有系统调用 perf trace -p 1234 # 统计 ls 命令的 syscall 耗时分布 perf trace --duration 1 -e 'syscalls:*' ls
高级实战技巧
▶ 生成火焰图(可视化性能瓶颈)
# 1. 采集数据(带调用栈) perf record -F 99 -a -g -- sleep 30 # 2. 转换数据为可读格式 perf script > out.perf # 3. 使用 FlameGraph 工具生成 SVG git clone https://github.com/brendangregg/FlameGraph cd FlameGraph ./stackcollapse-perf.pl < out.perf | ./flamegraph.pl > perf.svg
火焰图效果:
解读技巧:
- 横向宽度 = 函数出现频率
- 纵向深度 = 调用栈层级
- 鼠标悬停显示函数名和占比
▶ 追踪内核事件
分析磁盘 I/O 延迟或调度事件:
# 监控块设备 I/O 请求(需 root) sudo perf record -e block:block_rq_issue -a # 查看可用的内核跟踪点 perf list | grep tracepoint
▶ 内存分析
检测缓存未命中问题:
# 统计进程缓存未命中率 perf stat -e cache-references,cache-misses -p 1234
常见问题解决
-
perf
报错 “No permission to collect stats”
→ 执行sudo sysctl kernel.perf_event_paranoid=1
-
采样数据过大导致
perf report
卡顿
→ 用perf report --stdio > report.txt
导出文本分析 -
函数名显示为十六进制地址
→ 安装调试符号包(如dbgsym
/debuginfo
)
典型应用场景
场景 | 推荐命令组合 |
---|---|
CPU 占用飙升分析 | perf top 或 perf record/report |
程序首次运行卡顿 | perf stat 统计 IPC 与缓存命中率 |
网络延迟问题定位 | perf trace 追踪 socket 相关调用 |
多线程锁竞争 | perf lock 分析锁等待时间 |
最佳实践:生产环境中先用
perf stat
定位异常事件类型,再用perf record
深入采样。
perf
是 Linux 性能分析的瑞士军刀,从硬件事件到内核行为均可覆盖,掌握其核心命令组合(stat
/record
/report
/top
),配合火焰图可视化,能高效定位系统瓶颈,建议通过实际场景反复练习,结合手册 man perf
探索更多功能。
引用说明:
- Linux 内核文档:
tools/perf/Documentation/
- Brendan Gregg 性能分析指南:brendangregg.com/perf.html
- FlameGraph 工具库:github.com/brendangregg/FlameGraph
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5128.html