Perf Linux 性能分析工具教程
perf 是 Linux 内核自带的性能分析工具,可以对 CPU 周期、缓存命中、分支预测等硬件事件进行精确计数和采样。作为最强大的 Linux 性能分析工具之一,perf 能够帮助你在搬瓦工 VPS 上定位应用性能瓶颈,发现热点函数和代码路径。
一、安装 perf
# Ubuntu/Debian
apt update
apt install linux-tools-common linux-tools-$(uname -r) -y
# 如果找不到对应版本
apt install linux-tools-generic -y
# CentOS
yum install perf -y
# 验证安装
perf version
二、perf 基本命令
2.1 perf stat - 事件计数
# 统计命令执行期间的 CPU 性能计数
perf stat ls -la /
# 统计特定进程 10 秒内的性能计数
perf stat -p PID sleep 10
# 详细统计(包括更多硬件事件)
perf stat -d ls -la /
# 指定事件类型
perf stat -e cycles,instructions,cache-misses,cache-references ls -la /
# 重复 5 次并计算统计偏差
perf stat -r 5 ls -la /
关键指标含义:
- cycles:CPU 周期数,反映执行耗时。
- instructions:执行的指令数。
- IPC(Instructions Per Cycle):每周期执行的指令数,越高说明 CPU 利用率越好。
- cache-misses:缓存未命中次数,高值表示内存访问模式不佳。
- branch-misses:分支预测失败次数。
2.2 perf top - 实时热点
# 实时查看系统级热点函数
perf top
# 查看特定进程的热点
perf top -p PID
# 只看用户空间
perf top -U
# 只看内核空间
perf top -K
# 指定采样频率
perf top -F 99
2.3 perf record - 采样记录
# 对命令采样
perf record -g ls -la /
# 对运行中的进程采样 30 秒
perf record -g -p PID sleep 30
# 对整个系统采样
perf record -g -a sleep 10
# 指定采样频率(每秒 99 次)
perf record -F 99 -g -a sleep 30
# 设置采样的调用栈深度
perf record -g --call-graph dwarf -p PID sleep 30
2.4 perf report - 分析报告
# 查看采样报告(交互式)
perf report
# 按函数排序
perf report --sort=comm,dso,sym
# 输出文本格式
perf report --stdio
# 生成火焰图数据
perf script > perf.data.script
三、常用分析场景
3.1 CPU 热点分析
# 找出消耗 CPU 最多的函数
perf record -F 99 -g -a sleep 30
perf report --stdio --sort=overhead,sym | head -30
3.2 缓存性能分析
# 记录缓存相关事件
perf stat -e L1-dcache-loads,L1-dcache-load-misses,\
L1-icache-load-misses,LLC-loads,LLC-load-misses \
-p PID sleep 10
# 计算缓存命中率
# L1 命中率 = 1 - (L1-dcache-load-misses / L1-dcache-loads)
3.3 上下文切换分析
# 记录上下文切换事件
perf record -e context-switches -g -a sleep 10
perf report
# 统计上下文切换
perf stat -e cs -a sleep 5
3.4 调度器延迟分析
# 分析调度延迟
perf sched record sleep 10
perf sched latency --sort max
# 查看调度时间线
perf sched map
四、perf 与火焰图
perf 的采样数据可以生成火焰图,更直观地展示性能热点:
# 采样
perf record -F 99 -g -a sleep 30
# 导出脚本数据
perf script > out.perf
# 使用 FlameGraph 工具生成火焰图
git clone https://github.com/brendangregg/FlameGraph.git
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > flamegraph.svg
火焰图的详细使用请参考 火焰图 CPU 性能分析教程。
五、perf 高级功能
5.1 追踪点(Tracepoints)
# 列出所有可用追踪点
perf list tracepoint
# 追踪系统调用
perf trace -p PID
# 追踪特定系统调用
perf trace -e open,read,write -p PID
# 记录网络相关事件
perf record -e 'net:*' -a sleep 10
5.2 硬件断点
# 在内存地址上设置监控(数据访问断点)
perf record -e mem:0x7fff5678:rw -p PID sleep 5
5.3 perf probe - 动态探针
# 在函数入口添加探针
perf probe --add tcp_sendmsg
# 列出已添加的探针
perf probe --list
# 使用探针采样
perf record -e probe:tcp_sendmsg -a sleep 10
# 删除探针
perf probe --del tcp_sendmsg
六、VPS 环境注意事项
# 搬瓦工 KVM VPS 中,perf 可能需要调整权限
# 允许普通用户使用 perf
sysctl -w kernel.perf_event_paranoid=1
# 对于某些硬件计数器,在虚拟化环境中可能不可用
# 可以使用软件事件替代
perf stat -e task-clock,page-faults,context-switches,cpu-migrations \
-p PID sleep 10
总结
perf 是 Linux 上最强大的性能分析工具,能够从 CPU 周期到系统调用全面剖析应用性能。配合 火焰图 可以更直观地展示分析结果。其他互补工具包括 strace 系统调用追踪 和 BPFtrace 动态追踪。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 访问官网。