4. perf 工具安装与基础使用
perf 是 Linux 内核提供的性能分析工具集,基于内核的 Performance Events 子系统实现。它能够对 CPU 周期、缓存命中/缺失、分支预测、TLB 事件等进行精确采样与统计。本章将介绍 perf 的安装方法、事件查看与基础统计命令,为后续内存事件采样与 TLB 热点定位打下基础。
前置检查:perf 依赖内核配置
CONFIG_PERF_EVENTS=y。执行 cat /boot/config-$(uname -r) | grep PERF_EVENTS 确认内核已开启 perf 支持。
4.1 perf 安装方法
perf 工具通常随 Linux 发行版提供,也可从内核源码编译安装。以下列出三种主流安装方式:
| 发行版/方式 | 命令/步骤 | 说明 |
|---|---|---|
| Debian / Ubuntu (apt) | sudo apt update && sudo apt install linux-tools-common linux-tools-$(uname -r) |
自动匹配当前内核版本 |
| RHEL / CentOS / Fedora (yum/dnf) | sudo yum install perf 或 sudo dnf install perf |
EPEL 仓库可能需额外启用 |
| 源码编译 (source) |
|
需先安装内核源码及依赖(elfutils、libunwind 等) |
注意:源码编译方式需要安装
flex、bison、elfutils-libelf-devel、newt-devel 等开发包。若缺少依赖,make 过程会提示错误,请根据提示补充安装。
安装完成后,执行 perf --version 验证是否成功:
$ perf --version
perf version 6.8.0
4.2 perf list:查看支持的事件
perf list 命令用于列出当前系统支持的性能事件。事件分为硬件事件、软件事件、tracepoint 事件等类别。执行以下命令查看完整列表:
$ perf list
List of pre-defined events (to be used in -e):
branch-instructions OR branches [Hardware event]
branch-misses [Hardware event]
bus-cycles [Hardware event]
cache-misses [Hardware event]
cache-references [Hardware event]
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
ref-cycles [Hardware event]
alignment-faults [Software event]
context-switches OR cs [Software event]
cpu-clock [Software event]
cpu-migrations OR migrations [Software event]
dummy [Software event]
emulation-faults [Software event]
major-faults [Software event]
minor-faults [Software event]
page-faults OR faults [Software event]
task-clock [Software event]
L1-dcache-load-misses [Hardware cache event]
L1-dcache-loads [Hardware cache event]
L1-dcache-stores [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
LLC-load-misses [Hardware cache event]
LLC-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-loads [Hardware cache event]
iTLB-load-misses [Hardware cache event]
iTLB-loads [Hardware cache event]
...
常用事件分类说明:
| 事件类别 | 示例事件 | 用途 |
|---|---|---|
| Hardware event | cycles, instructions, cache-misses |
CPU 硬件计数器直接提供,精度高 |
| Software event | context-switches, page-faults, cpu-clock |
内核软件计数,用于调度、内存等分析 |
| Hardware cache event | dTLB-load-misses, LLC-load-misses |
缓存/TLB 层次事件,内存性能关键 |
| Tracepoint event | syscalls:sys_enter_read, kmem:mm_page_alloc |
内核静态 tracepoint,可深入内核行为 |
TLB 相关事件速查:在内存性能分析中,重点关注
dTLB-load-misses(数据 TLB 加载缺失)、dTLB-store-misses(数据 TLB 存储缺失)、iTLB-load-misses(指令 TLB 加载缺失)。这些事件直接反映 TLB 覆盖不足导致的地址翻译延迟。
4.3 perf stat:基础统计
perf stat 用于对目标程序运行期间的关键性能事件进行计数统计,是性能评估的起点。基本语法:
perf stat [-e event1,event2,...] <command>
示例:统计 ls 命令的 CPU 周期、指令数、缓存缺失和 TLB 缺失:
$ perf stat -e cycles,instructions,cache-misses,dTLB-load-misses ls
Performance counter stats for 'ls':
12,345,678 cycles # 0.00 GHz
8,901,234 instructions # 0.72 insn per cycle
12,345 cache-misses # 5.2% of all cache refs
1,234 dTLB-load-misses # 0.01% of all dTLB loads
0.001234567 seconds time elapsed
0.001234000 seconds user
0.000000000 seconds sys
perf stat 输出字段说明:
| 字段 | 含义 | 分析价值 |
|---|---|---|
cycles |
CPU 时钟周期总数 | 程序执行时间的基本度量 |
instructions |
执行的指令数 | 与 cycles 结合计算 IPC(每周期指令数) |
cache-misses |
缓存缺失次数 | 评估内存访问效率 |
dTLB-load-misses |
数据 TLB 加载缺失次数 | TLB 覆盖不足的直接指标 |
# 百分比 |
缺失率(如 5.2% of all cache refs) | 归一化比较不同程序的内存行为 |
seconds time elapsed |
程序实际运行时间(墙上时钟) | 包含 I/O 等待、调度延迟 |
实用技巧:
- 使用
-e指定多个事件,用逗号分隔,如-e cycles,instructions,dTLB-load-misses。 - 使用
-r N重复运行 N 次并取平均值,减少测量噪声:perf stat -r 5 -e cycles,instructions ./myapp。 - 使用
-p PID或-t TID附加到正在运行的进程/线程。
4.4 本章小结
- 安装:apt/yum 适合快速部署,源码编译适合定制内核环境。
- 事件查看:
perf list列出硬件、软件、缓存、tracepoint 四类事件,TLB 相关事件以dTLB-*、iTLB-*命名。 - 基础统计:
perf stat提供事件计数、缺失率、IPC 等关键指标,是内存性能分析的起点。