3. perf 安装与配置:不同发行版安装、内核配置与权限设置
在开始使用 perf 进行性能分析之前,必须确保工具正确安装、内核支持已启用、并且用户拥有足够的权限。本章将系统性地讲解 perf 在主流发行版上的安装方法、内核编译配置要求以及关键的权限控制机制。
3.1 不同发行版的 perf 安装方法
perf 工具通常作为 Linux 内核源码的一部分发布,但各发行版将其打包为独立的软件包。下表总结了 Ubuntu 和 CentOS 两大系列的主要安装方式:
| 发行版系列 | 软件包名称 | 安装命令 | 说明 |
|---|---|---|---|
| Ubuntu / Debian | linux-tools-commonlinux-tools-$(uname -r) |
|
安装与当前内核版本匹配的工具集;linux-tools-common 提供通用脚本。 |
| CentOS / RHEL 7/8 | perf |
|
直接安装 perf 二进制包,依赖自动解决。 |
| CentOS / RHEL 9+ | perf |
|
与 CentOS 8 一致,使用 DNF 包管理器。 |
| Fedora | perf |
|
Fedora 默认包含 perf,安装即可。 |
验证安装: 安装完成后,运行
perf --version 确认版本。如果提示“perf not found”,请检查 linux-tools-$(uname -r) 包是否与当前内核版本完全匹配。
3.2 内核配置要求:CONFIG_PERF_EVENTS
perf 的核心功能依赖于内核编译时启用的 CONFIG_PERF_EVENTS 配置项。该选项控制性能监控单元(PMU)的接口、硬件事件计数、软件事件以及 tracepoint 的访问。
以下是与 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 记录系统调用、调度等事件的基础。 |
CONFIG_FTRACE |
y |
Ftrace 框架,与 perf 协同提供更丰富的跟踪能力。 |
检查当前内核配置: 使用以下命令快速验证关键配置是否启用:
cat /boot/config-$(uname -r) | grep CONFIG_PERF_EVENTS
cat /boot/config-$(uname -r) | grep CONFIG_HW_PERF_EVENTS
如果输出为 is not set,则需要重新编译内核或更换发行版内核。
下图展示了 perf 事件子系统在内核中的位置及其与硬件、内核模块、用户空间的关系:
3.3 权限设置:perf_event_paranoid
出于安全考虑,Linux 内核通过 perf_event_paranoid 系统控制参数限制非特权用户对 perf 事件的访问。该参数位于 /proc/sys/kernel/perf_event_paranoid,其取值含义如下:
| 取值 | 含义 | 允许的操作 | 典型场景 |
|---|---|---|---|
| -1 | 完全开放 | 所有用户均可使用所有 perf 事件,包括硬件事件和原始 tracepoint。 | 开发环境、单用户工作站。 |
| 0 | 宽松模式 | 非特权用户可使用大部分事件,但部分敏感事件(如硬件 PMU)可能受限。 | 多用户开发服务器。 |
| 1 | 默认值(多数发行版) | 非特权用户只能使用软件事件和 tracepoint,无法访问硬件 PMU 计数器。 | 生产环境默认配置。 |
| 2 | 严格限制 | 非特权用户仅能使用 CPU 时钟事件,禁止访问硬件 PMU 和大部分 tracepoint。 | 高安全要求的生产环境。 |
| 3 | 完全禁用 | 非特权用户无法使用任何 perf 事件,仅 root 可用。 | 严格隔离环境。 |
临时修改(立即生效,重启失效):
sudo sysctl -w kernel.perf_event_paranoid=0
永久修改(重启后生效):
echo "kernel.perf_event_paranoid=0" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
下图展示了不同 perf_event_paranoid 级别下,用户权限与可用事件类型的关系:
3.4 其他相关权限与配置
- CAP_PERFMON 能力(Linux 5.8+): 允许非 root 用户获得 perf 监控能力,无需完全 root 权限。使用
setcap cap_perfmon+ep /path/to/perf赋予。 - kptr_restrict: 控制内核符号地址的可见性。设置为 0 可让 perf 解析内核符号,但存在安全风险。
- nmi_watchdog: NMI 看门狗会占用 PMU 计数器,可能导致 perf 事件计数不准确。在性能分析时可临时关闭:
echo 0 > /proc/sys/kernel/nmi_watchdog。
生产环境建议: 在性能分析期间,将
perf_event_paranoid 临时设为 0 或 -1,分析完成后恢复为 1。避免永久降低安全级别。