2. perf sched 安装与环境准备
在开始使用 perf sched 分析内核调度延迟与 CPU 迁移事件之前,必须确保系统环境满足工具运行和内核数据采集的基本要求。本章将系统性地介绍 perf 工具的安装方式、内核配置选项的开启方法,以及运行 perf sched 所需的权限设置与安全注意事项。
2.1 perf 工具安装
perf 工具是 Linux 内核源码树中 tools/perf 子目录下的用户空间程序,通常以独立包的形式由各发行版提供。根据操作系统类型,安装方式略有差异。
| 发行版 | 包名 | 安装命令 |
|---|---|---|
| Ubuntu / Debian | linux-tools-common linux-tools-$(uname -r) |
sudo apt install linux-tools-common linux-tools-$(uname -r) |
| RHEL / CentOS / Fedora | perf | sudo yum install perf 或 sudo dnf install perf |
| openSUSE / SUSE Linux | perf | sudo zypper install perf |
| Arch Linux | perf | sudo pacman -S perf |
版本验证:安装完成后,执行
perf --version 确认工具版本。建议使用内核版本 4.19 以上的系统,以获得更完整的调度事件支持。
如果发行版未提供预编译包,或需要定制编译选项,可以从内核源码编译安装:
# 下载内核源码(以 5.15 LTS 为例)
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.xx.tar.xz
tar -xf linux-5.15.xx.tar.xz
cd linux-5.15.xx/tools/perf
# 编译 perf(依赖 libelf、libdw、libunwind 等开发库)
make -j$(nproc)
# 安装到系统路径
sudo make install
依赖检查:编译 perf 需要安装
libelf-dev、libdw-dev、libunwind-dev、binutils-dev 等开发包。缺少依赖会导致某些功能(如符号解析、调用链回溯)不可用。
2.2 内核配置要求
perf sched 依赖内核中的多个配置选项来采集调度事件和统计信息。以下配置项必须在内核编译时启用,或在当前运行内核中确认已开启。
2.2.1 必需配置项
| 配置项 | 功能说明 | 检查命令 |
|---|---|---|
CONFIG_SCHEDSTATS=y |
启用调度统计信息收集,提供进程等待时间、运行时间、CPU 迁移次数等关键指标 | zgrep CONFIG_SCHEDSTATS /proc/config.gz |
CONFIG_SCHED_INFO=y |
在 task_struct 中记录调度信息字段,perf sched latency 依赖此配置 | zgrep CONFIG_SCHED_INFO /proc/config.gz |
CONFIG_PERF_EVENTS=y |
perf 事件子系统核心开关,所有 perf 工具的基础依赖 | zgrep CONFIG_PERF_EVENTS /proc/config.gz |
2.2.2 推荐配置项
| 配置项 | 功能说明 | 推荐理由 |
|---|---|---|
CONFIG_SCHED_DEBUG=y |
提供 /proc/sched_debug 接口,输出详细的调度器内部状态 | 辅助验证调度延迟分析结果 |
CONFIG_SCHEDSTATS_DEBUG=y |
扩展调度统计的调试信息 | 提供更细粒度的迁移事件记录 |
CONFIG_TRACING=y |
启用内核跟踪框架,perf sched record 依赖此功能 | 必须开启才能记录调度事件 |
快速检查脚本:以下命令可一次性检查关键配置是否开启:
for cfg in CONFIG_SCHEDSTATS CONFIG_SCHED_INFO CONFIG_PERF_EVENTS CONFIG_TRACING; do
result=$(zgrep "$cfg" /proc/config.gz 2>/dev/null || echo "未找到")
echo "$cfg: $result"
done
2.3 权限设置与安全注意事项
perf sched 需要访问内核事件和硬件性能计数器,默认情况下需要 root 权限或特定的系统配置。不正确的权限设置可能导致安全风险或功能受限。
2.3.1 权限模型
| 权限级别 | 可执行操作 | 配置方式 |
|---|---|---|
| root 用户 | 所有 perf 功能,包括调度事件记录、硬件计数器、跟踪点 | 直接使用 sudo perf sched record |
| 普通用户(受限) | 仅能访问软件事件和 tracepoint,无法使用硬件 PMU 计数器 | 默认情况下无需额外配置 |
| 普通用户(完全) | 所有 perf 功能,与 root 等效 | 设置 kernel.perf_event_paranoid = -1 |
2.3.2 安全参数调整
Linux 内核通过 /proc/sys/kernel/ 下的三个参数控制 perf 的访问权限:
# 查看当前 perf 权限参数
sysctl kernel.perf_event_paranoid
sysctl kernel.perf_event_max_sample_rate
sysctl kernel.perf_cpu_time_max_percent
# 允许普通用户使用所有 perf 功能(谨慎使用)
sudo sysctl -w kernel.perf_event_paranoid=-1
# 限制 perf 事件采样率,防止 DoS 攻击
sudo sysctl -w kernel.perf_event_max_sample_rate=100000
# 限制 perf 占用的 CPU 时间百分比(默认 25%)
sudo sysctl -w kernel.perf_cpu_time_max_percent=25
| 参数 | 默认值 | 安全建议 |
|---|---|---|
perf_event_paranoid |
2 | 生产环境保持 2(仅 root 可用);开发环境可设为 1 或 0 |
perf_event_max_sample_rate |
100000 | 避免设置过高(如 > 500000),防止系统过载 |
perf_cpu_time_max_percent |
25 | 生产环境建议 5-10%,减少性能干扰 |
安全警告:将
perf_event_paranoid 设为 -1 会允许非特权用户访问硬件性能计数器,可能被用于侧信道攻击(如利用 PMU 进行时序分析)。在多租户环境或生产服务器上,建议保持默认值 2,仅通过 sudo 提权使用 perf。
2.3.3 永久配置方法
若需要持久化权限设置,编辑 /etc/sysctl.conf 或创建 /etc/sysctl.d/99-perf.conf:
# /etc/sysctl.d/99-perf.conf
kernel.perf_event_paranoid = 1
kernel.perf_event_max_sample_rate = 100000
kernel.perf_cpu_time_max_percent = 10
应用配置:
sudo sysctl --system
2.4 环境验证清单
完成安装和配置后,执行以下步骤验证环境是否就绪:
- 检查 perf 版本:
perf --version,确认版本号与内核版本匹配。 - 验证内核配置:使用
zgrep CONFIG_SCHEDSTATS /proc/config.gz确认必需配置已启用。 - 测试基本功能:
sudo perf list sched,应输出调度相关的 tracepoint 列表。 - 测试记录功能:
sudo perf sched record -- sleep 1,应生成perf.data文件。 - 测试延迟分析:
sudo perf sched latency,应输出调度延迟统计表格。
常见问题排查:
- 如果
perf sched record报错 "No CONFIG_SCHEDSTATS support",请重新编译内核并开启CONFIG_SCHEDSTATS。 - 如果提示 "Permission denied",请使用
sudo或调整perf_event_paranoid。 - 如果
perf sched latency输出为空,检查是否使用了perf sched record先采集数据。