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)
cd /usr/src/linux/tools/perf
make -j$(nproc)
sudo make install
需先安装内核源码及依赖(elfutils、libunwind 等)
注意:源码编译方式需要安装 flex、bison、elfutils-libelf-devel、newt-devel 等开发包。若缺少依赖,make 过程会提示错误,请根据提示补充安装。

安装完成后,执行 perf --version 验证是否成功:

$ perf --version
perf version 6.8.0
perf 安装方式对比 apt / yum / dnf 包管理器安装 源码编译 内核源码/tools/perf 容器/镜像 Docker 内嵌 perf 选择建议 • 开发/测试环境:优先使用 apt/yum/dnf,快速部署 • 生产环境/定制内核:推荐源码编译,可启用额外 trace 插件 • 容器场景:使用宿主机 perf 或特权容器挂载内核事件接口

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 覆盖不足导致的地址翻译延迟。
perf 事件分类层次 perf 事件 Hardware cycles, instructions Software context-switches, faults Tracepoint syscalls, kmem, sched 提示:使用 perf list hw、perf list sw、perf list cache 可分别过滤硬件、软件、缓存事件。

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 附加到正在运行的进程/线程。
perf stat 工作流程 perf stat -e events 内核 perf 子系统 PMU 计数器 / tracepoint 目标程序执行 统计结果输出 cycles, misses, IPC ...

4.4 本章小结

  • 安装:apt/yum 适合快速部署,源码编译适合定制内核环境。
  • 事件查看:perf list 列出硬件、软件、缓存、tracepoint 四类事件,TLB 相关事件以 dTLB-*、iTLB-* 命名。
  • 基础统计:perf stat 提供事件计数、缺失率、IPC 等关键指标,是内存性能分析的起点。