3. perf安装与环境准备

在开始使用perf进行性能分析之前,必须正确安装工具并配置内核参数。不同Linux发行版的包管理方式不同,内核编译选项和运行时权限控制也直接影响perf的功能完整性。本章将逐一拆解这些前置条件,确保你的环境能够充分发挥perf的全部能力。

3.1 不同发行版的安装方法

perf工具通常以独立包的形式提供,但不同发行版的包名和依赖略有差异。下表列出了主流发行版的安装命令及对应包名:

发行版 包名 安装命令 说明
Ubuntu 20.04+ linux-tools-common
linux-tools-$(uname -r)
sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r)
自动匹配当前内核版本
CentOS 7 perf
sudo yum install perf
默认启用,直接安装即可
CentOS 8 / Rocky Linux 8+ perf
sudo dnf install perf
需启用EPEL仓库
Fedora perf
sudo dnf install perf
默认包含在kernel-tools中
Debian linux-perf
sudo apt install linux-perf
与Ubuntu类似,需匹配内核版本
openSUSE perf
sudo zypper install perf
默认包含在kernel-source中
提示:安装完成后,执行 perf --version 验证安装是否成功。如果提示“perf not found”,请检查是否安装了与当前内核版本完全匹配的perf包。Ubuntu用户尤其需要注意 linux-tools-$(uname -r) 中的内核版本号必须与 uname -r 输出一致。

3.2 内核配置要求:CONFIG_PERF_EVENTS

perf的核心功能依赖于内核编译时开启的 CONFIG_PERF_EVENTS 选项。该选项控制着性能事件子系统的启用,包括硬件PMU(Performance Monitoring Unit)计数、软件事件跟踪、tracepoint采样等。如果内核未开启此选项,perf将无法正常工作。

检查当前内核是否已启用 CONFIG_PERF_EVENTS:

# 方法一:查看 /boot/config-$(uname -r)
grep CONFIG_PERF_EVENTS /boot/config-$(uname -r)

# 方法二:通过 /proc/config.gz(如果内核支持)
zcat /proc/config.gz | grep CONFIG_PERF_EVENTS

# 方法三:使用 perf 自身检测
perf stat ls / 2>&1 | head -5

预期输出应为:

CONFIG_PERF_EVENTS=y

如果输出为 CONFIG_PERF_EVENTS=n 或 # CONFIG_PERF_EVENTS is not set,则需要重新编译内核并开启此选项。下表列出了与perf相关的关键内核配置项及其作用:

配置项 推荐值 作用说明
CONFIG_PERF_EVENTS y 启用perf事件子系统,必选
CONFIG_HW_PERF_EVENTS y 启用硬件PMU事件(CPU周期、缓存命中/未命中等)
CONFIG_UPROBE_EVENTS y 支持用户态动态探针(uprobe)
CONFIG_KPROBE_EVENTS y 支持内核态动态探针(kprobe)
CONFIG_TRACEPOINTS y 启用静态tracepoint,perf record -e 的基础
CONFIG_FTRACE y 函数跟踪支持,与perf的ftrace后端协作
CONFIG_DEBUG_INFO y 提供符号表和调试信息,提升perf report可读性
注意:大多数发行版(Ubuntu、CentOS、Fedora)的默认内核均已开启 CONFIG_PERF_EVENTS。如果你使用的是自定义编译内核或嵌入式系统(如Yocto、Buildroot),请务必在 make menuconfig 中确认该选项已勾选。缺少该选项时,perf会报错“Kernel not configured for perf events”。
内核配置与perf功能依赖关系 perf 工具 CONFIG_PERF_EVENTS=y CONFIG_HW_PERF_EVENTS=y CONFIG_TRACEPOINTS=y 硬件PMU计数 软件事件 tracepoint采样 动态探针 函数跟踪 perf stat -e cycles perf record -e sched:* perf probe --add perf ftrace 所有功能均依赖 CONFIG_PERF_EVENTS=y,缺少任一配置将导致对应perf命令不可用

3.3 权限设置:/proc/sys/kernel/perf_event_paranoid

出于安全考虑,Linux内核通过 /proc/sys/kernel/perf_event_paranoid 控制非特权用户对perf事件的访问权限。该参数的值决定了哪些用户可以使用perf以及可以访问哪些事件类型。

查看当前权限等级:

cat /proc/sys/kernel/perf_event_paranoid

各等级的含义如下表所示:

值 含义 允许的操作 适用场景
-1 无限制 所有用户可访问所有事件(包括硬件PMU和内核tracepoint) 开发环境、单用户工作站
0 轻度限制 非特权用户可访问硬件PMU和软件事件,但禁止内核tracepoint 多用户开发服务器
1 中度限制(默认值) 非特权用户只能访问软件事件和部分tracepoint,硬件PMU受限 大多数发行版默认设置
2 严格限制 仅特权用户(root或CAP_PERFMON)可使用perf 生产环境、安全敏感系统
3 禁止非特权访问 完全禁止非root用户使用perf事件子系统 高安全等级环境
最佳实践:对于学习和开发环境,建议将 perf_event_paranoid 设置为 0 或 -1,以便完整体验perf的所有功能。生产环境中建议保持默认值 1,仅对特定用户或容器授予 CAP_PERFMON 权限。

临时修改权限(重启后失效):

# 设置为无限制(开发环境推荐)
sudo sh -c 'echo -1 > /proc/sys/kernel/perf_event_paranoid'

# 设置为轻度限制
sudo sh -c 'echo 0 > /proc/sys/kernel/perf_event_paranoid'

永久修改权限(重启后生效):

# 编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-perf.conf
echo 'kernel.perf_event_paranoid = 0' | sudo tee -a /etc/sysctl.d/99-perf.conf

# 立即生效
sudo sysctl -p /etc/sysctl.d/99-perf.conf

3.4 其他关键环境检查

除了上述核心配置外,以下环境因素也会影响perf的使用体验:

  • 内核符号表(kallsyms):确保 /proc/kallsyms 可读,用于内核符号解析。如果 kernel.kptr_restrict 设置为1或2,非root用户将无法读取内核符号地址。
  • 用户态调试符号:安装应用程序的debuginfo包(如 glibc-debuginfo、kernel-debuginfo),可显著提升 perf report 的符号解析质量。
  • NUMA拓扑感知:多路服务器上,perf需要正确识别NUMA节点。检查 numactl --hardware 输出是否正常。
  • 时间同步:perf采样依赖高精度时间戳,确保系统时钟源稳定(推荐 tsc 或 hpet)。
常见问题:如果执行 perf stat 时出现 “You may not have permission to collect stats” 错误,请依次检查:① perf_event_paranoid 是否 ≤ 0;② 当前用户是否在 perf 组中(某些发行版需要);③ 是否使用了容器或cgroup v2的权限隔离。
perf权限控制流程 用户执行perf命令 是root? 完全访问所有事件 检查paranoid值 paranoid ≤0: 硬件+软件事件 =1: 仅软件事件 ≥2: 拒绝访问

3.5 验证环境就绪

完成上述安装和配置后,执行以下命令快速验证环境是否就绪:

# 1. 检查perf版本
perf --version

# 2. 测试基本计数(应输出CPU周期数)
perf stat -e cycles sleep 1

# 3. 测试tracepoint采样(需要root或paranoid ≤ 0)
sudo perf record -e sched:sched_switch -a -- sleep 1

# 4. 检查内核配置完整性
perf list 2>&1 | head -20