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

perf 工具是 Linux 内核源码树中 tools/perf 子目录下的用户空间程序,其安装方式因发行版而异。本章将系统讲解在主流发行版上的安装方法、内核必须开启的配置选项,以及运行 perf top 所需的权限设置,确保你能够快速搭建一个可用的性能分析环境。

3.1 不同发行版上的 perf 安装

perf 的安装方式主要分为两类:通过发行版包管理器安装预编译包,以及从内核源码手动编译。对于大多数场景,推荐使用包管理器安装,因为其依赖关系自动处理,且与当前内核版本匹配。

发行版 包名 安装命令 备注
Ubuntu / Debian linux-tools-common
linux-tools-$(uname -r)
sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r)
需安装与当前内核版本号完全匹配的 tools 包
RHEL / CentOS / Rocky / Alma perf
sudo yum install perf
或
sudo dnf install perf
EPEL 仓库可能需额外启用
Fedora perf
sudo dnf install perf
默认仓库包含
openSUSE perf
sudo zypper install perf
—
Arch Linux perf(位于 linux-tools 组)
sudo pacman -S perf
—
Alpine Linux perf
sudo apk add perf
需启用 community 仓库
验证安装:安装完成后,执行 perf --version 确认版本信息。若输出类似 perf version 5.15.0,则安装成功。若提示 WARNING: perf not found for kernel ...,说明内核版本与 tools 包不匹配,需重新安装对应版本。

3.2 从内核源码编译 perf

当需要最新特性、自定义补丁或发行版未提供预编译包时,可选择从内核源码编译。步骤如下:

  1. 获取内核源码:从 kernel.org 下载或克隆 git 仓库。
  2. 进入 perf 源码目录:cd linux/tools/perf
  3. 安装编译依赖(以 Ubuntu 为例):
sudo apt install flex bison libelf-dev libdw-dev libaudit-dev \
                 libslang2-dev libnuma-dev libunwind-dev \
                 libcap-dev liblzma-dev libzstd-dev
  1. 编译并安装:
make -j$(nproc)
sudo make install

编译后的二进制默认安装到 /usr/local/bin/perf。若需安装到其他路径,可使用 make prefix=/usr install。

注意:编译时若缺少 libelf-dev 等依赖,perf 会以“最小功能集”编译,导致 perf top 无法解析符号或读取硬件计数器。务必安装所有可选依赖以获得完整功能。

3.3 内核配置要求

perf 依赖内核中的一系列配置选项。若内核编译时未开启这些选项,perf 将无法正常工作或功能受限。以下为关键配置项:

配置项 说明 推荐值
CONFIG_PERF_EVENTS perf 事件子系统主开关 y
CONFIG_HW_PERF_EVENTS 硬件性能计数器支持(PMU) y
CONFIG_FTRACE 函数跟踪支持,perf 的 tracepoint 依赖此选项 y
CONFIG_KALLSYMS 内核符号表导出,perf top 解析内核函数名必需 y
CONFIG_KALLSYMS_ALL 导出所有内核符号(包括非导出的静态函数) y(推荐)
CONFIG_DEBUG_INFO 内核调试信息,提供更精确的符号与行号 y(推荐)
CONFIG_FRAME_POINTER 帧指针支持,提升调用链准确性 y(推荐)
CONFIG_UPROBES 用户空间探针,perf probe 依赖 y(可选)

检查当前内核配置的方法:

zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)

然后使用 grep 过滤关键项:

grep -E 'CONFIG_PERF_EVENTS|CONFIG_HW_PERF_EVENTS|CONFIG_FTRACE|CONFIG_KALLSYMS' /proc/config.gz
云环境与容器注意事项:在公有云虚拟机或 Docker 容器中,内核通常由宿主机提供,租户无法修改内核配置。若缺少关键选项(如 CONFIG_PERF_EVENTS),perf 将无法使用硬件事件。此时可退而使用软件事件(如 cpu-clock、task-clock)或 tracepoint 事件。

3.4 权限设置

perf top 需要访问性能计数器和内核符号表,默认情况下普通用户权限不足。权限设置不当会导致以下典型错误:

  • No permission to enable perf_event_open syscall
  • You may not have permission to collect stats
  • Access to performance monitoring and observability operations denied

以下为三种常见的权限解决方案:

方案 操作 适用场景 安全性
1. 使用 root 或 sudo sudo perf top 临时分析、单次调试 低(完全提权)
2. 设置 perf_event_paranoid sudo sysctl -w kernel.perf_event_paranoid=1 允许非 root 用户访问硬件事件 中
3. 配置 CAP_PERFMON 权限 sudo setcap cap_perfmon+ep /usr/bin/perf 生产环境、细粒度权限控制 高

perf_event_paranoid 级别说明:

  • 2(默认):仅允许 root 访问所有事件。
  • 1:允许非 root 用户访问硬件事件和软件事件,但禁用内核函数级跟踪。
  • 0:允许非 root 用户访问所有事件,包括内核函数级跟踪。
  • -1:无限制(不推荐)。

持久化修改 paranoid 级别:

echo 'kernel.perf_event_paranoid=1' | sudo tee -a /etc/sysctl.d/99-perf.conf
sudo sysctl -p /etc/sysctl.d/99-perf.conf
推荐做法:在生产环境中,优先使用 CAP_PERFMON 能力(Linux 5.8+ 引入),而非直接 sudo 或降低 paranoid 级别。这样 perf 二进制文件仅获得必要的性能监控能力,不提升其他系统调用权限。

3.5 安装与配置流程总览

以下 SVG 图总结了从安装到权限配置的完整流程,帮助你快速定位当前所处的步骤:

perf top 安装与配置流程 步骤 1:选择安装方式 包管理器安装(推荐) 从内核源码编译 步骤 2:验证安装 (perf --version) 步骤 3:检查内核配置 配置满足 → 继续 配置缺失 → 重新编译内核 步骤 4:权限设置 (sudo / paranoid / CAP_PERFMON)

3.6 常见问题与排查

问题现象 可能原因 解决方案
perf top 输出为空或只显示 <not counted> 内核配置缺少 CONFIG_HW_PERF_EVENTS;或 paranoid 级别过高 检查内核配置;设置 perf_event_paranoid=1
Failed to open /proc/kcore 普通用户无权限读取内核内存映射 使用 sudo 或设置 CAP_PERFMON
WARNING: perf not found for kernel ... 安装的 linux-tools 版本与当前内核不匹配 执行 sudo apt install linux-tools-$(uname -r)
perf top 无法显示函数名,只显示地址 内核未开启 CONFIG_KALLSYMS;或缺少调试符号 开启 CONFIG_KALLSYMS;安装 linux-image-$(uname -r)-dbg
安全提醒:在共享主机或生产环境中,切勿将 perf_event_paranoid 设置为 -1 或 0,这会使所有用户都能监控系统级性能事件,存在信息泄露风险。始终优先使用 CAP_PERFMON 能力绑定到特定二进制文件。