3. perf安装与环境准备
在开始使用perf进行性能分析之前,必须正确安装工具并配置内核参数。不同Linux发行版的包管理方式不同,内核编译选项和运行时权限控制也直接影响perf的功能完整性。本章将逐一拆解这些前置条件,确保你的环境能够充分发挥perf的全部能力。
3.1 不同发行版的安装方法
perf工具通常以独立包的形式提供,但不同发行版的包名和依赖略有差异。下表列出了主流发行版的安装命令及对应包名:
| 发行版 | 包名 | 安装命令 | 说明 |
|---|---|---|---|
| Ubuntu 20.04+ | linux-tools-common linux-tools-$(uname -r) |
|
自动匹配当前内核版本 |
| CentOS 7 | perf | |
默认启用,直接安装即可 |
| CentOS 8 / Rocky Linux 8+ | perf | |
需启用EPEL仓库 |
| Fedora | perf | |
默认包含在kernel-tools中 |
| Debian | linux-perf | |
与Ubuntu类似,需匹配内核版本 |
| openSUSE | 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”。
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的权限隔离。
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