01. 全流程诊断的准备工作
01.1 确认工具与权限
在进行 Linux 性能排查时,perf 是核心工具,通常需要 root 权限或拥有 CAP_SYS_ADMIN 能力。为了避免权限阻塞,确保系统配置允许 perf 事件的采样,并根据安全策略设置 kernel.perf_event_paranoid 参数。
执行前可以先检查版本与安装状态,确保 perf 已可用且版本较新,避免老版本的事件集不完整导致分析缺失。
01.2 系统基线与观测目标
在高性能场景下,设定一个基线是关键,尤其需要明确 CPU、内存、IO 的基线消耗,以便于后续对比。
记录当前负载下的系统指标,如 平均负载、内存使用、磁盘等待时间,并将这些数据作为后续对比的起点。
02. 实时监控与快速定位:top 的基础用法
02.1 实时查看 CPU 与内存状态
top 提供了一个实时视图,按 CPU 使用率排序、按内存占用排序等视图能快速识别热点进程。
通过命令参数,可以在不干扰系统的情况下进行快速观测,例如 top -b -n 1 用于一次性快照,便于日志对比。
top -b -n 1 | head -n 40
02.2 针对性筛选目标进程
如果在基线中发现某些进程异常占用,可使用 top 的进程聚焦功能把页面焦点锁定到目标 PID。
此时需要关注的关键字段包括 %CPU、VIRT、RES、SHR、TIME+,以判断是计算密集、内存泄露还是 I/O 阻塞。
02.3 交互与快键键的高效用法
熟练使用 P、M、F、O 等快捷键,可以在实时查看中快速变换排序维度,提升诊断效率。
top -b -n 1 -p -o +%CPU
03. Perf 的全流程诊断:从采样到可解释的热点
03.1 选择与采集基础事件
perf 的 strength 在于覆盖广泛的硬件事件,先用 perf stat 评估基线事件,例如 cycles、instructions、cache-misses,再按需扩展。
采集时建议 指定系统级别(-a)或进程级别(-p

# 基线统计(全局)
perf stat -e cycles,instructions,cache-references,cache-misses -a sleep 5# 针对单个进程
perf stat -e cycles,instructions -p 1234 -a 5
03.2 记录热点事件并生成火焰图与报告
当需要深入分析函数级热点时,使用 perf record 捕获事件,然后通过 perf report 查看热点函数分布,从而定位热点代码路径。
记录时可以开启 Call Graph,以便获取调用关系,选择 -g 或 --call-graph fp。
perf record -F 99 -a -g -- sleep 10
perf report -i perf.data --stdio
03.3 动态观测:perf top 与 perf annotate
perf top 提供了一个动态的热点列表,可以实时看到哪个函数在消耗 CPU,与 top 的静态对比有互补性。
对于具体函数的汇编级分析,执行 perf annotate,可以快速定位瓶颈指令序列,结合缓存命中与分支预测成本进行评估。
perf top -e cycles,instructions
perf annotate -i perf.data
03.4 针对 I/O 与缓存的专门事件
除了 CPU 周期,缓存命中率、TLB 失效、磁盘 I/O 等事件同样重要,可通过 perf stat 组合相关事件来评估总线拥塞与内存带宽瓶颈。
在磁盘密集型场景中,结合 iostat、vmstat 的外部信息,可以更全面地理解 I/O 行为与等待时间。
04. 将 perf 与 top 的全流程诊断流程结合
04.1 以 top 作为初步热点的入口
在系统出现性能下降时,先使用 top 的实时视图定位占用资源的热点进程,了解是否存在异常延迟、内存压力或多进程竞争。
通过将 top 的输出记录到日志,可以形成基线对比,用于后续 perf 的深入分析。
04.2 用 perf 进行深入的事件分析
识别出热点后,选取相关事件进行 perf 记录,如对 CPU 高负载的进程进行 -p 指定记录,或对整个系统进行 -a 采样。
随后用 perf report 解析热点区域的调用路径,寻找成本最高的函数段,以及是否存在分支预测失败等问题。
04.3 结果落地与复盘记录
将 perf data 与 top 观测结果合并,形成可复现的诊断记录,便于日后对比回溯。
在诊断报告中明确 热点函数、调用关系、缓存与分支成本,以便团队协作与后续优化验证。
05. 典型场景演示:从诊断到要点归纳
05.1 场景一:单机高 CPU 占用中的热点定位
首先在 top 中定位到 单个或少数进程占用大部分 CPU,随后用 perf record 针对该进程进行采样,结合 perf report 找到核心函数。
如果核心函数是用户态算法,关注实现中的循环、分支和向量化成本,需要进一步用 perf annotate 查看汇编指令。
top -b -n 1 | head -n 20
perf record -p 1234 -F 99 -g -- sleep 5
perf report -i perf.data
05.2 场景二:IO 密集型应用的瓶颈识别
在磁盘 I/O 较高时,top 的 IOwait 列可能持续上升,与此同时 perf stat 的 I/O 相关事件可帮助确认瓶颈。
通过 perf stat 观察 cache-reference 与 cache-misses 的变化,结合磁盘等待时间,可以判断是否为缓存未命中导致的频繁内存访问。
perf stat -e cache-references,cache-misses -p 1234 -a 5
iostat -xz 1
05.3 场景三:内存带宽与缓存争用
内存密集型应用会出现缓存带宽竞争,perf 的 cache-misses、LLC_load_misses 等指标能够揭示争用情况,结合 top 的内存使用情况进行对比。
如果发现 TLB 失效增多或大页内存未命中,需要关注内存分配策略与应用层缓存友好性,以降低缓存缺失的成本。
perf stat -e cache-references,cache-misses,LLC_load_misses -p 1234 -a 5
perf top -e cycles -p 1234


