3. perf 安装与配置:不同发行版安装、内核配置与权限设置

在开始使用 perf 进行性能分析之前,必须确保工具正确安装、内核支持已启用、并且用户拥有足够的权限。本章将系统性地讲解 perf 在主流发行版上的安装方法、内核编译配置要求以及关键的权限控制机制。

3.1 不同发行版的 perf 安装方法

perf 工具通常作为 Linux 内核源码的一部分发布,但各发行版将其打包为独立的软件包。下表总结了 Ubuntu 和 CentOS 两大系列的主要安装方式:

发行版系列 软件包名称 安装命令 说明
Ubuntu / Debian linux-tools-common
linux-tools-$(uname -r)
sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r)
安装与当前内核版本匹配的工具集;linux-tools-common 提供通用脚本。
CentOS / RHEL 7/8 perf
sudo yum install perf          # CentOS 7
sudo dnf install perf          # CentOS 8+
直接安装 perf 二进制包,依赖自动解决。
CentOS / RHEL 9+ perf
sudo dnf install perf
与 CentOS 8 一致,使用 DNF 包管理器。
Fedora perf
sudo dnf install 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 事件子系统在内核中的位置及其与硬件、内核模块、用户空间的关系:

perf 事件子系统内核架构 用户空间 (Userspace) perf 命令行工具 / perf_event_open() 系统调用 内核核心层 (Kernel Core) CONFIG_PERF_EVENTS → perf_event 子系统 事件调度、缓冲区管理、采样、计数 硬件抽象层 (PMU 驱动) CONFIG_HW_PERF_EVENTS → CPU PMU / 硬件计数器 Intel PEBS / AMD IBS / ARM SPE 跟踪与探针层 (Tracing & Probe) CONFIG_TRACEPOINTS | CONFIG_KPROBE_EVENTS | CONFIG_UPROBE_EVENTS

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 级别下,用户权限与可用事件类型的关系:

perf_event_paranoid 权限层级与可用事件 -1 所有事件:硬件 PMU、软件事件、tracepoint、kprobe、uprobe 0 大部分事件可用,硬件 PMU 可能受限 1 软件事件 + tracepoint,无硬件 PMU 2 仅 CPU 时钟事件 3 仅 root 可用,非特权用户完全禁用 权限逐渐收紧

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。避免永久降低安全级别。