3. perf top 安装与配置:在不同发行版上安装 perf、内核配置要求、权限设置
perf 工具是 Linux 内核源码树中 tools/perf 子目录下的用户空间程序,其安装方式因发行版而异。本章将系统讲解在主流发行版上的安装方法、内核必须开启的配置选项,以及运行 perf top 所需的权限设置,确保你能够快速搭建一个可用的性能分析环境。
3.1 不同发行版上的 perf 安装
perf 的安装方式主要分为两类:通过发行版包管理器安装预编译包,以及从内核源码手动编译。对于大多数场景,推荐使用包管理器安装,因为其依赖关系自动处理,且与当前内核版本匹配。
| 发行版 | 包名 | 安装命令 | 备注 |
|---|---|---|---|
| Ubuntu / Debian | linux-tools-commonlinux-tools-$(uname -r) |
|
需安装与当前内核版本号完全匹配的 tools 包 |
| RHEL / CentOS / Rocky / Alma | perf |
或 |
EPEL 仓库可能需额外启用 |
| Fedora | perf |
|
默认仓库包含 |
| openSUSE | perf |
|
— |
| Arch Linux | perf(位于 linux-tools 组) |
|
— |
| Alpine Linux | perf |
|
需启用 community 仓库 |
验证安装:安装完成后,执行
perf --version 确认版本信息。若输出类似 perf version 5.15.0,则安装成功。若提示 WARNING: perf not found for kernel ...,说明内核版本与 tools 包不匹配,需重新安装对应版本。
3.2 从内核源码编译 perf
当需要最新特性、自定义补丁或发行版未提供预编译包时,可选择从内核源码编译。步骤如下:
- 获取内核源码:从 kernel.org 下载或克隆 git 仓库。
- 进入 perf 源码目录:
cd linux/tools/perf - 安装编译依赖(以 Ubuntu 为例):
sudo apt install flex bison libelf-dev libdw-dev libaudit-dev \
libslang2-dev libnuma-dev libunwind-dev \
libcap-dev liblzma-dev libzstd-dev
- 编译并安装:
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 syscallYou may not have permission to collect statsAccess 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 图总结了从安装到权限配置的完整流程,帮助你快速定位当前所处的步骤:
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 能力绑定到特定二进制文件。