4. perf 安装与环境配置:不同发行版的安装方法与内核配置要求
perf 是 Linux 内核自带的性能剖析工具,其安装与运行高度依赖内核编译选项。不同发行版的包管理方式与内核默认配置存在差异,本章将系统讲解 Ubuntu 与 CentOS 两大主流发行版的安装流程,以及确保 perf 功能完整所需的内核配置项。
4.1 内核配置要求:CONFIG_PERF_EVENTS 与相关选项
perf 的核心功能由内核子系统 perf_events 提供。若内核编译时未开启相关选项,即使安装了 perf 用户态工具,也无法正常采集硬件事件、软件事件或跟踪点数据。
cat /boot/config-$(uname -r) | grep PERF_EVENTS,若输出 CONFIG_PERF_EVENTS=y 或 =m,则内核已支持 perf 基础功能。
下表列出 perf 完整功能所需的关键内核配置项及其作用:
| 配置项 | 推荐值 | 作用说明 |
|---|---|---|
CONFIG_PERF_EVENTS |
y | perf 事件子系统主开关,必须开启 |
CONFIG_HW_PERF_EVENTS |
y | 启用硬件性能计数器(如 CPU 周期、指令数) |
CONFIG_FTRACE |
y | 函数跟踪框架,perf 的 tracepoint 依赖此选项 |
CONFIG_KPROBES |
y | 动态探针支持,用于 perf probe 动态插桩 |
CONFIG_UPROBES |
y | 用户态动态探针,用于分析用户程序热点 |
CONFIG_FRAME_POINTER |
y | 保留栈帧指针,提升 perf 调用链采样准确性 |
CONFIG_DEBUG_INFO |
y | 内核调试符号,用于将地址解析为函数名 |
CONFIG_FRAME_POINTER 或 CONFIG_DEBUG_INFO,这会导致 perf 生成的火焰图调用链不完整或符号无法解析。建议在专用物理机或虚拟机中运行 perf 分析。
4.2 Ubuntu 发行版安装 perf
Ubuntu 将 perf 工具打包在 linux-tools-common 和对应内核版本的 linux-tools-$(uname -r) 包中。推荐使用 apt 安装。
4.2.1 安装步骤
- 更新包索引:
sudo apt update - 安装通用 perf 包:
sudo apt install linux-tools-common -y - 安装当前内核对应的 perf 版本:
sudo apt install linux-tools-$(uname -r) -y - 验证安装:
perf --version
E: Unable to locate package linux-tools-5.x.x-xxx-generic,说明当前内核版本较新或为自定义内核。可尝试安装 linux-tools-generic 通用包:sudo apt install linux-tools-generic -y。
4.2.2 Ubuntu 内核配置检查
Ubuntu 官方内核(generic 系列)默认开启 CONFIG_PERF_EVENTS 和 CONFIG_HW_PERF_EVENTS,但 CONFIG_FRAME_POINTER 在较新版本中可能被 CONFIG_UNWINDER_ORC 替代。可通过以下命令确认:
cat /boot/config-$(uname -r) | grep -E "CONFIG_PERF_EVENTS|CONFIG_FRAME_POINTER|CONFIG_UNWINDER_ORC"
若输出显示 CONFIG_UNWINDER_ORC=y 且 CONFIG_FRAME_POINTER 未开启,perf 仍可正常工作,但火焰图的调用链精度可能略低于帧指针模式。
4.3 CentOS / RHEL 发行版安装 perf
CentOS 7/8/9 及 RHEL 系列使用 yum 或 dnf 包管理器。perf 工具包含在 perf 包中,与内核版本绑定。
4.3.1 安装步骤
- CentOS 7 / RHEL 7(使用 yum):
sudo yum install perf -y - CentOS 8/9 / RHEL 8/9(使用 dnf):
sudo dnf install perf -y - 验证安装:
perf --version
4.3.2 CentOS 内核配置特点
CentOS 使用 RHEL 内核,默认开启 CONFIG_PERF_EVENTS 和 CONFIG_HW_PERF_EVENTS。但 CONFIG_FRAME_POINTER 在 CentOS 8+ 中默认关闭,转而使用 CONFIG_UNWINDER_ORC。此外,CONFIG_DEBUG_INFO 在 CentOS 最小安装中可能未安装对应的 debuginfo 包,需要额外安装:
sudo debuginfo-install kernel -y
或手动下载对应内核版本的 kernel-debuginfo 和 kernel-debuginfo-common RPM 包安装。
4.4 发行版对比与选择建议
下表对比 Ubuntu 与 CentOS 在 perf 安装与配置上的关键差异:
| 对比维度 | Ubuntu | CentOS / RHEL |
|---|---|---|
| 包管理器 | apt | yum / dnf |
| perf 包名 | linux-tools-$(uname -r) |
perf |
| 内核配置默认开启 | CONFIG_PERF_EVENTS、CONFIG_HW_PERF_EVENTS | CONFIG_PERF_EVENTS、CONFIG_HW_PERF_EVENTS |
| 帧指针默认状态 | 较新版本关闭(使用 ORC unwinder) | CentOS 8+ 关闭(使用 ORC unwinder) |
| debuginfo 安装 | 自动随内核包安装 | 需手动安装 kernel-debuginfo |
| 适用场景 | 开发环境、桌面、通用服务器 | 企业生产环境、稳定性优先 |
4.5 perf 环境验证与内核配置关系图
下图展示 perf 用户态工具、内核配置项与硬件/软件事件源之间的依赖关系,帮助理解配置缺失时的故障定位路径。
4.6 常见安装问题与排查
- perf: command not found:未安装 perf 包,按对应发行版步骤安装。
- WARNING: perf not found for kernel x.x.x:Ubuntu 中
linux-tools-$(uname -r)包缺失,尝试安装linux-tools-generic。 - Failed to open /proc/modules:权限不足,使用
sudo perf或以 root 身份运行。 - No permission to enable perf_event:需设置
kernel.perf_event_paranoid参数,执行sudo sysctl -w kernel.perf_event_paranoid=-1。 - Cannot find event 'cycles':内核未开启
CONFIG_HW_PERF_EVENTS,需重新编译内核或更换发行版。
perf list 命令查看当前系统支持的事件列表。若输出为空或仅包含少量软件事件,说明内核配置不完整,需要升级内核或调整编译选项。