perf 工具详解
perf
(Performance Counters for Linux)是 Linux 系统上的一个强大的性能分析工具,用于监控和分析系统及应用程序的性能。它基于 Linux 内核的 Performance Event Subsystem(perf_events),能够收集硬件(如 CPU 计数器)和软件(如上下文切换、缺页异常)的性能数据。
perf 的主要功能
perf
提供了多种子命令,用于不同的性能分析场景:
子命令 | 用途 |
---|---|
perf stat | 统计程序运行时的性能事件(如 CPU 周期、缓存命中率等) |
perf record | 记录性能数据(生成 perf.data 文件) |
perf report | 分析 perf record 记录的数据 |
perf top | 实时显示系统中最耗 CPU 的函数 |
perf annotate | 查看代码级别的性能热点 |
perf trace | 类似 strace ,跟踪系统调用 |
perf bench | 运行内核微基准测试 |
perf 的典型用途
1. CPU 性能分析
- 查看哪些函数占用 CPU 最多
perf top
- 统计程序的 CPU 使用情况
perf stat ./my_program
- 记录程序的调用栈(火焰图分析)
perf record -g ./my_program perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg
2. 内存分析
- 统计缓存命中率
perf stat -e cache-misses,cache-references ./my_program
- 分析内存访问模式
perf record -e mem-loads,mem-stores ./my_program
3. I/O 和系统调用分析
- 跟踪系统调用
perf trace ./my_program
- 分析磁盘 I/O 延迟
perf record -e block:block_rq_issue,block:block_rq_complete
4. 锁和调度分析
- 分析多线程程序的锁竞争
perf record -e sched:sched_stat_wait ./my_threaded_program
- 查看上下文切换情况
perf stat -e context-switches ./my_program
perf 的底层原理
perf
基于 Linux 内核的 perf_events 子系统,可以访问:
- 硬件性能计数器(PMCs):如 CPU 周期、指令数、缓存命中/失效等。
- 软件事件:如上下文切换、缺页异常、调度事件等。
- 动态探针(kprobes/uprobes):跟踪内核和用户态函数调用。
perf 的安装
在大多数 Linux 发行版上,perf
可以通过包管理器安装:
# Ubuntu/Debian
sudo apt install linux-tools-common linux-tools-generic
# CentOS/RHEL
sudo yum install perf
# Arch Linux
sudo pacman -S perf
总结
perf
是 Linux 系统性能分析的瑞士军刀,可用于:
✅ CPU 热点分析
✅ 内存访问模式分析
✅ I/O 和系统调用跟踪
✅ 锁竞争和调度分析
✅ 火焰图生成(FlameGraph)
如果你需要优化程序性能或排查系统瓶颈,perf
是一个非常强大的工具! 🚀