服务器CPU跑满但不知道卡在哪,是Linux运维里最常见的排查场景。perf是内核自带、几乎无安装成本的性能分析工具,配合火焰图可以把CPU时间精确分配到函数级。本文介绍perf采样、火焰图生成与解读,以及上下文切换、锁竞争这几类高频瓶颈的处理方式。
perf采样:定位CPU热点函数
perf基于硬件性能计数器做周期性采样,每隔固定周期记录当前执行指令对应的函数地址,统计各函数被采样到的次数,次数占比近似CPU占用率。对已运行的服务进程采样,先用perf top实时观察:
# 实时观察指定进程的CPU热点
perf top -p $(pidof nginx)
# 指定采样周期和调用栈深度,记录10秒
perf record -F 99 -g -p $(pidof mysqld) -- sleep 10
perf report
-F 99表示每秒采样99次,-g开启调用栈记录。采样频率不宜过高,99次/秒在负载高的机器上足够;调用栈深度默认64层,足够覆盖大部分调用链。
火焰图生成与瓶颈解读
perf record生成perf.data后,用FlameGraph工具集转成火焰图。先生成折叠栈,再生成SVG:
# 安装FlameGraph后执行 perf script > out.perf ./stackcollapse-perf.pl out.perf > out.folded ./flamegraph.pl out.folded > cpu.svg
火焰图读法:横轴表示采样占比(宽度越宽耗时越高),纵轴是调用栈,下层函数调用上层。看图顺序:先找顶部最宽的函数块,那个是真正消耗CPU的执行热点;再沿调用链向下找入口函数,判断是应用逻辑问题还是系统调用问题。火焰图”尖峰”表示短时突发的单点调用,”平顶”表示常驻循环,后者的优化收益更大。
上下文切换与锁竞争分析
CPU毛刺频繁但函数热点不明显时,重点查上下文切换。vmstat 1观察cs列数值,高于稳定基线几万说明切换严重;再用perf stat查看context-switches计数:
perf stat -e context-switches,cpu-migrations,cycles,instructions -p PID
cpu-migrations高表示线程在CPU间频繁迁移,通常由cgroup配置或负载均衡策略引起;上下文切换高且大量发生在锁等待时,用off-cpu火焰图补采样:capture off-cpu时间栈,找出线程睡眠等待的锁对象。锁热点常出现在数据库连接池、日志输出、共享计数器等位置,缓解方向是拆分锁粒度、改用读写锁或无锁数据结构(原子变量、乐观锁)。
perf在常见场景的排查步骤
一次完整的排查流程:先top看整体负载和CPU使用率(user/system/sys),判断user高还是sys高;user高说明应用层逻辑占主导,直接火焰图定位热点函数;sys高说明系统调用和内核态占用多,重点查文件IO、网络协议栈、内存拷贝;若CPU空闲但服务慢,则切换排查IO等待、锁等待和网络延迟,用pidstat -d -p、iostat补齐磁盘证据链。perf只负责CPU侧证据,性能问题往往是多环节叠加,证据收集完整再动手。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-xing-neng-fen-xi-shi-zhan-perf-cai-yang-yu-huo-yan-tu/