Linux perf 指令
perf 是 Linux 系统中一款功能强大的性能分析工具,集成了内核和用户空间的性能监控功能,用于诊断系统性能瓶颈、分析应用程序行为以及优化硬件资源利用。它是 Linux 内核提供的原生工具,广泛应用于系统管理员、开发者和性能工程师的工作中。perf 支持多种性能事件(如 CPU 周期、缓存未命中、系统调用),并提供采样、统计和跟踪等功能。结合其子命令和选项,perf 可实现从全局监控到代码级分析的全面性能诊断。
📚 什么是 perf 指令?
概述
perf 是 Linux 内核提供的性能分析工具,集成在 linux-tools 软件包中,通常随内核源码分发。它通过访问硬件性能计数器(PMC)、内核跟踪点和用户态事件,提供系统和应用程序的性能数据。perf 由 Linux 内核开发者维护,支持大多数现代 Linux 发行版(如 Ubuntu、CentOS、Arch Linux)。perf 的核心功能包括性能采样(profiling)、事件统计、动态跟踪和调用栈分析,适用于 CPU、内存、I/O 和内核等性能分析场景。它的设计注重高效性和灵活性,能够从系统级到代码级提供细粒度洞察。
核心概念
- 性能事件(Events):
- 硬件事件:CPU 周期、指令数、缓存未命中。
- 软件事件:上下文切换、页面错误。
- 跟踪点事件:系统调用、调度事件。
- 动态事件:kprobes、uprobes。
- 采样(Profiling):
- 定期记录程序计数器(PC),生成性能热点图。
- 统计(Counting):
- 累计事件发生次数,提供总量分析。
- 跟踪(Tracing):
- 记录事件的时间序列,分析动态行为。
- 调用栈(Call Stack):
- 捕获函数调用链,定位性能瓶颈。
- 性能计数器(PMC):
- 硬件提供的寄存器,记录低级事件。
- 子命令:
- stat:事件统计。
- record:采样数据。
- report:分析采样结果。
- trace:系统调用跟踪。
- 退出状态:
- 成功:返回 0。
- 失败(如权限不足):返回非 0。
核心特点
- 多维度分析:支持硬件、软件和内核事件。
- 高效采样:低开销,适合生产环境。
- 灵活子命令:覆盖统计、采样和跟踪。
- 跨平台:支持 x86、ARM 等架构。
- 脚本集成:与 Python、Perl 等结合。
- 可视化支持:生成火焰图、热点图。
基本语法
perf [子命令] [选项] [命令]
参数说明
- 子命令:
- stat:统计事件。
- record:记录采样数据。
- report:查看采样结果。
- list:列出支持的事件。
- trace:跟踪系统调用。
- sched:调度分析。
- lock:锁分析。
- 选项:
- -e EVENT:指定事件(如 cycles)。
- -p PID:监控特定进程。
- -a:系统范围监控。
- -g:捕获调用栈。
- -F FREQ:采样频率。
- -o FILE:输出文件。
- –help:显示帮助。
- 命令:
- 要监控的程序(如 ls、make)。
- 输出行为:
- 根据子命令,输出统计、报告或数据文件。
- 错误(如权限不足)输出到 stderr。
注意事项
-
权限要求:
-
部分功能需 root 权限:
sudo perf stat ls -
调整 /proc/sys/kernel/perf_event_paranoid:
echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid
-
-
内核支持:
- 要求 Linux 2.6.31+,推荐 4.x+。
-
硬件依赖:
- PMC 依赖 CPU 型号(如 Intel、AMD)。
-
安装检查:
-
确保安装:
sudo apt install linux-tools-common linux-tools-$(uname -r) # Ubuntu sudo dnf install perf # CentOS
-
-
数据大小:
- 采样数据可能占用大量磁盘。
-
安全性:
- 谨慎在生产环境高频采样。
🔧 perf 的常见用途
应用场景
- 性能瓶颈诊断:定位 CPU、内存或 I/O 问题。
- 代码优化:分析函数和指令级性能。
- 系统监控:观察全局或进程级行为。
- 内核调试:跟踪系统调用和调度。
- 锁分析:诊断多线程竞争。
- 硬件利用率:评估缓存和分支预测。
🛠️ 基础用法与示例
准备工作
以下示例假设运行在 Bash shell(如 Ubuntu 24.04,当前时间为 2025年6月17日周二上午8:20 CST)。测试环境为标准 Linux 系统(4核 Intel CPU,16GB 内存),确保 perf 已安装(perf --version)。示例涉及 CPU 密集型程序、系统调用跟踪和采样分析,假设用户具有 root 权限。命令在终端运行,系统支持 UTF-8 编码。
检查 perf
perf --version
输出:
perf version 6.8.dist
安装 perf
sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r)
创建测试程序
cat > /tmp/test.c <<EOF
#include <stdio.h>
int main() {
for (long i = 0; i < 1000000000; i++) {
volatile int x = i * i;
}
printf("Done\n");
return 0;
}
EOF
gcc /tmp/test.c -o /tmp/test
示例 1:统计 CPU 事件
命令
sudo perf stat /tmp/test
说明
- 统计程序的默认性能事件(如 CPU 周期、指令)。
输出
Performance counter stats for '/tmp/test':
2,345.12 msec task-clock # 0.999 CPUs utilized
123 context-switches # 0.052 K/sec
2 cpu-migrations # 0.001 K/sec
1,234 page-faults # 0.526 K/sec
5,678,123,456 cycles # 2.421 GHz
9,876,543,210 instructions # 1.74 insn per cycle
123,456,789 branches # 52.627 M/sec
1,234,567 branch-misses # 1.00% of all branches
0.002346125 seconds time elapsed
示例 2:采样性能热点
命令
sudo perf record /tmp/test
sudo perf report
说明
- 记录采样数据并生成报告。
输出(报告部分)
Samples: 2K of event 'cycles', Event count (approx.): 5678123456
Overhead Command Shared Object Symbol
99.12% test test [.] main
0.88% test libc.so.6 [.] __libc_start_main
示例 3:列出支持事件
命令
perf list
说明
- 显示可监控的事件。
输出(部分)
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
cache-misses [Hardware event]
syscalls:sys_enter_open [Tracepoint event]
示例 4:系统调用跟踪
命令
sudo perf trace -e openat ls
说明
- 跟踪 openat 系统调用。
输出
0.000 ls/12345 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
0.012 ls/12345 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
示例 5:监控特定进程
命令
/tmp/test &
sudo perf stat -p $!
说明
- 监控后台进程的性能。
输出
Performance counter stats for process id '12345':
2,350.45 msec task-clock # 0.999 CPUs utilized
125 context-switches # 0.053 K/sec
3 cpu-migrations # 0.001 K/sec
1,235 page-faults # 0.525 K/sec
示例 6:自定义事件
命令
sudo perf stat -e cycles,instructions,cache-misses /tmp/test
说明
- 监控特定事件。
输出
Performance counter stats for '/tmp/test':
5,678,123,456 cycles # 2.421 GHz
9,876,543,210 instructions # 1.74 insn per cycle
123,456,789 cache-misses # 52.627 M/sec
0.002346125 seconds time elapsed
🚀 常用子命令与功能
🔍 性能统计(stat)
| 选项 | 描述 |
|---|---|
| -e EVENT | 指定事件 |
| -p PID | 监控进程 |
| -a | 系统范围 |
| -r N | 重复运行 N 次 |
示例
sudo perf stat -e cycles -r 3 ls
📜 性能采样(record/report)
| 选项 | 描述 |
|---|---|
| -F FREQ | 采样频率 |
| -g | 捕获调用栈 |
| -o FILE | 输出文件 |
示例
sudo perf record -F 999 -g /tmp/test
sudo perf report -i perf.data
📁 事件跟踪(trace)
| 选项 | 描述 |
|---|---|
| -e EVENT | 跟踪事件 |
| -p PID | 跟踪进程 |
示例
sudo perf trace -e sched:sched_switch
🌟 高级用法
概述
高级用法涉及动态跟踪、火焰图生成、锁分析和内核优化。
🛡️ 1. 动态跟踪(kprobes)
命令
sudo perf probe -a do_sys_open
sudo perf record -e probe:do_sys_open -a sleep 5
sudo perf report
说明
- 使用 kprobes 跟踪内核函数。
🔍 2. 火焰图生成
脚本
sudo perf record -F 99 -g /tmp/test
sudo perf script > out.perf
git clone https://github.com/brendangregg/FlameGraph
cd FlameGraph
./stackcollapse-perf.pl ../out.perf > out.folded
./flamegraph.pl out.folded > flame.svg
说明
- 生成可视化火焰图,定位热点。
🔄 3. 锁分析
命令
sudo perf lock record /tmp/test
sudo perf lock report
说明
- 分析多线程锁竞争。
⚡ 4. 调度分析
命令
sudo perf sched record sleep 5
sudo perf sched latency
说明
- 分析调度延迟。
🔐 5. 用户态跟踪(uprobes)
命令
sudo perf probe -x /tmp/test main
sudo perf record -e probe_test:main /tmp/test
sudo perf report
说明
- 跟踪用户程序函数。
⚠️ 使用 perf 时的注意事项
-
权限要求:
-
调整 perf_event_paranoid:
sudo sysctl -w kernel.perf_event_paranoid=0
-
-
内核支持:
-
检查内核版本:
uname -r
-
-
数据管理:
-
清理采样数据:
rm perf.data
-
-
性能开销:
-
降低采样频率:
perf record -F 99
-
-
安全性:
- 限制 root 使用。
🛠️ 高级技巧与实战案例
概述
以下是高级技巧和实战案例,展示 perf 的复杂应用。
🖥️ 案例 1:Web 服务器优化
命令
sudo perf record -F 999 -p $(pidof nginx) -g sleep 10
sudo perf report
说明
- 分析 Nginx 性能瓶颈。
📦 案例 2:数据库性能
命令
sudo perf stat -e cache-misses -p $(pidof mysqld) sleep 5
说明
- 监控 MySQL 缓存未命中。
🔒 案例 3:多线程调试
命令
sudo perf lock record ./multithread_app
sudo perf lock report
说明
- 诊断锁竞争。
📈 案例 4:系统监控
命令
sudo perf stat -a -e cycles,instructions sleep 5
说明
- 全局 CPU 使用分析。
🔧 案例 5:自定义脚本
脚本
#!/bin/bash
sudo perf record -F 99 -g "$@"
sudo perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > flame.svg
说明
- 自动化火焰图生成。
🔗 与其他工具结合
-
与 FlameGraph:
perf script | stackcollapse-perf.pl | flamegraph.pl -
与 strace:
perf trace -e openat strace ls -
与 gdb:
perf record ./app; gdb ./app -c perf.data
📝 总结
perf 是 Linux 系统中强大的性能分析工具,适用于系统优化、代码调试和内核分析。本文从基础到高级,结合详细示例和注意事项,全面介绍了 perf 的功能。无论是定位瓶颈、生成火焰图还是跟踪系统调用,perf 都能提供高效支持。
1709

被折叠的 条评论
为什么被折叠?



