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 依赖内核中的多个配置选项来采集调度事件和统计信息。以下配置项必须在内核编译时启用,或在当前运行内核中确认已开启。

perf sched 内核配置依赖关系 perf sched CONFIG_SCHEDSTATS CONFIG_SCHED_INFO CONFIG_PERF_EVENTS CONFIG_SCHED_DEBUG CONFIG_SCHEDSTATS_DEBUG CONFIG_TRACING 说明:绿色为必需配置,橙色为推荐配置,紫色为跟踪子系统依赖 可通过 /proc/config.gz 或 /boot/config-$(uname -r) 检查当前内核配置

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 环境验证清单

完成安装和配置后,执行以下步骤验证环境是否就绪:

  1. 检查 perf 版本:perf --version,确认版本号与内核版本匹配。
  2. 验证内核配置:使用 zgrep CONFIG_SCHEDSTATS /proc/config.gz 确认必需配置已启用。
  3. 测试基本功能:sudo perf list sched,应输出调度相关的 tracepoint 列表。
  4. 测试记录功能:sudo perf sched record -- sleep 1,应生成 perf.data 文件。
  5. 测试延迟分析: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 先采集数据。
perf sched 环境验证流程 ① 安装 perf ② 检查内核配置 ③ 设置权限 ④ 测试记录 ⑤ 验证延迟 任何步骤失败 → 回退检查:内核版本 / 配置 / 权限 / 依赖库 使用 dmesg | grep perf 查看内核日志中的错误信息