3. perf工具概述与安装

perf 是 Linux 内核官方提供的性能分析工具集,基于内核的 perf_event 子系统,能够以极低开销采集 CPU 周期、缓存命中、分支预测、硬件事件、软件事件以及 tracepoint 数据。本章将梳理 perf 的发展脉络、子系统架构,并指导完成安装与安全配置。

3.1 perf工具的发展历史

perf 的演进与 Linux 内核性能监控能力的扩展紧密相关,主要经历了以下里程碑:

时间 内核版本 关键变化
2009年 2.6.31 perf_event 子系统首次合入主线,提供统一的硬件性能计数器抽象
2010年 2.6.35 引入 perf record / perf report 基本采样流程
2012年 3.5 支持 tracepoint 事件采集,perf 开始覆盖内核跟踪
2015年 4.2 perf 集成 Intel PT(Processor Trace)解码能力
2018年 4.18 perf stat 支持 --all-cpus 和 --per-thread 精细化统计
2020年 5.8 perf 支持 BPF 程序附加,与 eBPF 工具链深度整合
2023年 6.x perf 成为内核源码树内标准工具,支持更多异构架构事件
关键认知: perf 不是独立项目,而是内核源码 tools/perf/ 目录下的官方工具。每次内核发布新特性,perf 几乎同步获得对应能力,因此保持内核与 perf 版本匹配非常重要。

3.2 perf子系统架构

perf_event 子系统采用分层设计,从硬件寄存器到用户态工具共四层。下图展示了核心组件与数据流向:

perf_event 子系统架构图 perf_event 子系统架构 用户态工具层 perf / perf stat / perf record / perf top 系统调用接口层 perf_event_open() syscall 内核核心层 (perf_event 子系统) 事件调度器 环形缓冲区 采样/计数引擎 事件上下文 PMU 回调 事件分组 硬件抽象层 (PMU 驱动) x86 PMU / ARM PMUv3 / RISC-V SBI / 软件 PMU 硬件层 CPU 性能计数器 / 缓存 / 分支预测单元 数据流:用户态工具 → syscall → 事件调度 → PMU 驱动 → 硬件计数器 → 环形缓冲区 → 用户态读取

架构要点说明:

  • 用户态工具层:提供 perf stat(计数)、perf record(采样)、perf top(实时热点)等命令,通过 perf_event_open() 系统调用与内核交互。
  • 内核核心层:事件调度器负责将用户请求映射到具体 PMU(Performance Monitoring Unit);环形缓冲区用于无锁传递采样数据;采样/计数引擎区分计数模式与采样模式。
  • 硬件抽象层:各架构 PMU 驱动实现统一接口,perf 无需关心底层寄存器细节。
  • 硬件层:CPU 内部性能计数器、缓存监控单元(CMT)、分支记录(BTS/LBR)等物理资源。

3.3 perf的安装与基本配置

3.3.1 安装 perf

perf 的安装方式取决于发行版。推荐从内核源码编译以获得最佳匹配,但多数场景下使用包管理器即可:

发行版 安装命令 说明
Ubuntu / Debian sudo apt install linux-tools-common linux-tools-$(uname -r) 自动匹配当前内核版本
RHEL / CentOS / Rocky sudo yum install perf 或 sudo dnf install perf EPEL 仓库可能需额外启用
Fedora sudo dnf install perf 默认仓库包含
Arch Linux sudo pacman -S perf 来自 linux-tools 包组
源码编译 cd linux/tools/perf && make && sudo make install 需内核源码树,推荐开发环境使用
验证安装: 执行 perf --version 应输出类似 perf version 6.x 的信息。执行 perf list 可查看当前系统支持的所有事件类型。

3.3.2 安全配置:perf_event_paranoid

出于安全考虑,Linux 内核通过 kernel.perf_event_paranoid 系统控制参数限制 perf 的使用权限。该参数控制非特权用户能否访问性能计数器以及是否允许内核级采样。

取值 含义 典型场景
-1 完全开放,无任何限制 调试环境、单用户工作站
0 允许非特权用户访问 CPU 硬件事件,但不允许内核 tracepoint 开发测试机
1 允许非特权用户访问 CPU 硬件事件,但禁用内核 tracepoint(默认值) 大多数发行版默认配置
2 仅允许特权用户(root 或 CAP_PERFMON)使用 perf 生产环境、多租户服务器
3 禁止所有用户使用 perf_event 子系统 高安全隔离场景

查看当前值:

cat /proc/sys/kernel/perf_event_paranoid

临时修改(立即生效,重启失效):

sudo sysctl -w kernel.perf_event_paranoid=0

永久修改(写入 sysctl 配置文件):

echo 'kernel.perf_event_paranoid=0' | sudo tee -a /etc/sysctl.d/99-perf.conf
sudo sysctl -p /etc/sysctl.d/99-perf.conf
生产环境建议: 保持 paranoid=2,仅授予特定用户 CAP_PERFMON 权限(sudo setcap cap_perfmon+ep /usr/bin/perf),避免全局降低安全水位。

3.3.3 其他关键配置

除 paranoid 外,以下参数也影响 perf 行为:

  • kernel.perf_event_max_sample_rate: 控制每 CPU 最大采样频率,默认 100000(100 kHz)。过高可能导致中断风暴,降低系统响应。
  • kernel.perf_cpu_time_max_percent: 限制 perf 采样占用的 CPU 时间百分比,默认 25%。
  • kernel.perf_event_mlock_kb_per_pid: 每个进程可 mlock 的环形缓冲区内存上限,默认 512 KB。

查看所有 perf 相关内核参数:

sysctl -a 2>/dev/null | grep perf

3.4 快速验证:perf stat 基础用法

安装并配置完成后,使用 perf stat 验证工具是否正常工作:

# 统计 ls 命令的 CPU 周期和指令数
perf stat ls

# 输出示例:
#  Performance counter stats for 'ls':
#         1,234,567      cycles
#         2,345,678      instructions
#       0.001234567 seconds time elapsed

如果输出正常显示硬件事件计数,说明 perf 安装成功且权限配置正确。若出现 perf_event_open failed: Permission denied,则需检查 perf_event_paranoid 设置或使用 sudo 执行。

下一步准备: 确认 perf 可用后,即可进入第 4 章学习 perf stat 的详细统计模式与事件选择语法。