广告

Linux 性能排查技巧:perf 与 top 的实战使用与性能诊断指南

实战框架与准备工作

性能排查的基本流程

在进行 Linux 性能排查时,明确的工作流是确保问题能够快速定位与复现的关键。确定目标、收集基线数据、定位瓶颈、验证修复四个阶段相互依赖,缺一不可。本文围绕 perftop 的实战使用,帮助你建立可重复的诊断路径。

在第一步中,你需要对系统当前负载和应用行为形成感知,激活必要的监控指标以建立基线。CPU、内存、磁盘 I/O、网络和缓存命中率等指标应作为关注点,避免只盯着单一指标导致误判。

接着进入第二步,通过系统级别的采样数据快速定位热点区域。此阶段要善用 perf 的事件集合和 top 的实时视图,以便发现高消耗的进程、线程和函数入口。快速筛选、准确定位、可重复验证是本阶段的核心目标。

环境准备与数据采集

在正式排查前,确保运行环境稳定,并为后续分析做好数据记录。固定的样本频率、稳定的负载模式和一致的系统参数有助于减小噪声。

开启 perf 与 top 的数据采集前,应先安排好合适的采样时间窗口,并在必要时增加数据保留容量。系统-wide(-a)采样与按进程(-p)粒度采样需要根据实际场景进行选择。

# 查看当前系统可用的 perf 事件
perf list | head -n 20# 采集 1 秒钟内的 CPU 周期与指令数(系统级别)
perf stat -e cycles,instructions -a sleep 1

perf 的核心用法与场景

采样与事件选择

perf 的核心价值在于能以最小开销对系统事件进行采样和统计。选择合适的事件集,既要覆盖热点路径,又要避免信息冗余。

常用事件包括 cyclesinstructionscache-referencescache-missesbranch-mmisses 等。通过组合这些事件,可以获得对 CPU、缓存、分支预测等的全面视角。

# 查看常用 perf 事件并选择感兴趣的集合
perf list | egrep "cycles|instructions|cache|branch"# 记录系统级别的 CPU 周期与指令数,持续 2 秒
perf stat -e cycles,instructions -a duration 2

常用 perf 子命令对比

perf 提供了多种子命令,用于不同诊断阶段的需要。stat适合快速统计、recordreport组合用于完整的离线分析、topannotate用于持续关注与深入定位。

在选择子命令时,理解它们的输出与目标非常重要:stat给出整体趋势,record生成可交互分析的数据,report输出最关键的函数与调用关系。

# 快速统计系统事件
perf stat -e cycles,instructions -a sleep 1# 全量采样并生成性能报告
perf record -a -g -- sleep 60
perf report --stdio

top 的实时监控与诊断技巧

实时CPU、内存、I/O 监控

top 是最直观的实时监控工具,能够快速把握系统的核心瓶颈。CPU 使用率、内存消耗、以及 I/O 等待往往是初步判断的出发点。

要获得持续的可观测性,可以将输出以批处理方式保存,便于与 perf 的离线结果对比。批处理模式(-b)与固定输出行数能提高可复现性。

Linux 性能排查技巧:perf 与 top 的实战使用与性能诊断指南

# 以批处理模式输出头部信息,便于快速查看资源热点
top -b -n 1 -w 80 | head -n 30

top 与 perf 的组合诊断

将 top 的实时视图与 perf 的深度分析结合起来,能够从宏观热图迅速跳转到微观热点。对于高 CPU 占用的进程,先用 top 确定,再用 perf 深挖其函数调用路径。

可以通过 perf top 实时显示热点函数的 CPU 占比,快速切换观察点以定位哪个函数是瓶颈。若需要更细粒度的调用关系,可结合 perf recordperf report 进行离线分析。

# 实时查看当前进程的热点函数
perf top -e cycles -p 1234# 结合 top 的结果进行深度分析
top -b -n 1 -p 1234
perf record -p 1234 -g -- sleep 30
perf report --stdio

性能诊断案例与代码示例

CPU 热点定位案例

在一个长时间运行的服务中,CPU 使用率持续偏高,但单独查看进程列表无法明确瓶颈所在。此时,perftop 的组合显示了热点函数,帮助定位到具体代码区域。

第一步通过 top 观察总体趋势,确认高 CPU 的进程。第二步使用 perf top 观察热点函数及其占比,最后用 perf record 与 perf report 还原调用栈。

# 用 top 短时观察
top -b -n 1 | head -n 20# 在进程 5678 上实时跟踪热点函数
perf top -e cycles -p 5678# 记录 30 秒的调用栈,得到可分析的报告
perf record -p 5678 -g -- sleep 30
perf report --stdio

磁盘 I/O 热点定位案例

磁盘 I/O 瓶颈往往表现为高 I/O 等待和低缓存命中。通过 perf 与 iostat/sar 的组合,可以从系统调用到磁盘驱动的全链路诊断。

先用 iostat 或 sar 确认磁盘队列深度和等待时间,再用 perf 对磁盘相关的事件进行观察,定位到触发 I/O 滤镜的热点路径。

# 验证磁盘 I/O 的等待情况
iostat -x 1 2# perf 关注磁盘相关事件,结合 sleep 时间段采样
perf stat -e bs_reserts,workqueue,reads -a -I 2000 -t -e ci -D
# 记录磁盘相关的系统调用路径
perf record -e sys_enter_read -a -- sleep 20
perf report --stdio

广告

操作系统标签