4. perf top 基本使用:启动、界面布局与快捷键

perf top 是 Linux 性能分析中最常用的实时采样工具,它能够以极低的开销持续采集 CPU 上正在执行的函数,并按采样命中次数排序展示。本节将带你从零启动 perf top,解读其界面布局,并掌握高频快捷键,为后续定位内核热函数打下操作基础。

4.1 启动 perf top

perf top 的启动命令非常简洁,但根据分析目标不同,常用参数组合有所区别。以下是最常用的启动方式:

场景 命令 说明
基础启动 sudo perf top 默认以 1ms 周期采样所有 CPU,显示内核与用户态函数
仅内核态 sudo perf top -k vmlinux 只显示内核符号,适合定位内核热函数
指定 CPU sudo perf top -C 0,1 只采样 CPU 0 和 CPU 1,减少干扰
指定进程 sudo perf top -p 1234 只分析 PID 为 1234 的进程
调整采样频率 sudo perf top -F 99 每秒采样 99 次,降低开销
权限提示:perf top 需要 root 权限才能访问硬件 PMU 计数器,因此命令前必须加 sudo。如果遇到 "No permission to collect stats" 错误,请检查 /proc/sys/kernel/perf_event_paranoid 的值,建议设为 1 或更低。

启动后,终端会进入一个实时刷新的交互界面,默认每 2 秒刷新一次采样数据。下图展示了 perf top 启动后的核心流程:

perf top 启动与采样流程 sudo perf top PMU 计数器初始化 定时采样循环 读取 PMC 寄存器 IP → 符号解析 排序 & 刷新显示 持续循环 采样周期默认 1ms(-F 1000),每次采样记录当前 CPU 的指令指针寄存器(IP), 然后通过内核符号表将 IP 解析为函数名,最后按命中次数降序排列。

4.2 界面布局解读

perf top 的终端界面分为四个主要区域,每个区域承载不同的信息。理解这些区域是高效使用 perf top 的前提。

perf top 界面布局分区 区域 1:状态栏 采样周期: 1000 Hz | 事件: cycles | 丢失: 0% | 总采样: 125,000 区域 2:列标题 Samples │ │ Function 区域 3:函数列表(核心区域) 5.23% [kernel] native_write_msr 4.87% [kernel] __do_softirq 3.41% [kernel] tick_nohz_idle_exit 2.95% [kernel] _raw_spin_lock 2.10% [kernel] finish_task_switch 1.88% [kernel] __schedule 1.55% [kernel] menu_select ... 更多行滚动显示 区域 4:底部提示栏 按 'h' 查看帮助 | 'd' 切换显示延迟 | 'e' 打开/关闭符号过滤 提示:函数列表默认按采样占比降序排列,占比越高表示该函数消耗 CPU 时间越多。

各区域详细说明如下:

区域 内容 关键信息
状态栏 采样频率、事件类型、丢失率、总采样数 丢失率 > 5% 说明采样频率过高,需降低 -F 参数
列标题 Samples(采样数)、Function(函数名) 默认显示采样占比百分比
函数列表 按采样占比降序排列的函数名 占比最高的函数即为当前热函数
底部提示栏 快捷键提示、当前过滤条件 按 h 可查看完整快捷键列表

4.3 常用快捷键

perf top 提供了丰富的交互式快捷键,让你无需退出即可动态调整分析视角。以下是最高频使用的快捷键:

快捷键 功能 使用场景
h 显示/隐藏帮助页面 初次使用或忘记快捷键时
d 切换显示延迟(采样间隔) 默认 2 秒,按 d 可改为 1 秒或 0.5 秒
e 打开/关闭符号过滤输入框 只显示包含特定关键词的函数
z 将当前列设置为排序基准 按采样数、占比或其他列排序
0-9 切换事件类型 0=cycles, 1=instructions, 2=cache-misses 等
q 退出 perf top 结束分析
实战技巧:当发现某个函数占比异常高时,立即按 e 输入该函数名进行过滤,可以排除其他函数干扰,专注观察该函数的采样波动。例如输入 native_write_msr 后,界面将只显示包含该字符串的函数。

4.4 实战:首次定位内核热函数

下面通过一个完整的操作序列,演示如何用 perf top 快速定位内核热函数:

  1. 启动采样:执行 sudo perf top -F 99 -k vmlinux,以 99Hz 频率仅采样内核态。
  2. 观察顶部函数:等待 10 秒,记录占比最高的 3 个函数。
  3. 过滤分析:按 e,输入排名第一的函数名,观察其采样占比是否持续增长。
  4. 切换事件:按 1 切换到 instructions 事件,查看该函数的指令数占比。
  5. 记录数据:按 q 退出,准备后续使用 perf record 进行深度采样。
常见误区:不要只看一次采样的结果。perf top 是实时工具,建议至少观察 30 秒,确认热函数占比稳定后再下结论。如果某个函数占比忽高忽低,可能是系统负载波动导致,需要结合 perf stat 做全局确认。