perf
是Linux系统中功能全面的性能分析框架,用于性能调优、问题诊断、性能瓶颈分析和系统行为跟踪,支持CPU、内存、磁盘、网络等多维度性能数据采集,是Linux性能工程师和开发人员的核心工具集。
使用 perf 工具需要安装,核心依赖 linux-tools-common(通用工具包)和与当前内核版本匹配的 linux-tools-$(uname -r)(内核工具包)。
# Ubuntu/Debian 系列
sudo apt install -y linux-tools-common linux-tools-$(uname -r)
# CentOS 7/RHEL 7
sudo yum install -y perf
# CentOS 8/RHEL 8 及以上(用 dnf 替代 yum)
sudo dnf install -y perf
# 验证安装
perf --versionperf top
是perf工具集下的实时CPU热点采样工具,通过周期性采集CPU指令执行数据,按占比排序展示系统或指定进程中消耗CPU最多的函数、模块(内核态/用户态),核心作用是快速定位CPU使用率过高的根源(如异常进程、热点函数、内核瓶颈),无需修改应用代码,是运维和开发排查CPU性能问题的核心工具。
perf top [选项]
核心输出列详解
常用选项
-p <pid>:"process",仅分析指定进程ID(PID)的CPU占用,聚焦单个异常进程。示例:若
top发现PID为1234的进程CPU占比90%,执行perf top -p 1234,可单独分析该进程的热点函数。-g:"call graph",生成函数调用栈(调用关系链),展示高CPU函数的上层调用者,便于追溯问题触发链路。示例:
perf top -p 1234 -g,可查看进程1234中热点函数的调用来源,如“process_data_loop→main_loop→main”,快速定位代码逻辑中的触发点。-k <vmlinux>:"kernel",指定内核符号表文件路径,用于解析内核态函数名(避免仅显示内存地址)。示例:
perf top --kernel -k /usr/lib/debug/lib/modules/$(uname -r)/vmlinux,可正确显示内核中net_rx_action(网络收包处理函数)等热点函数,便于排查内核级瓶颈。-d <n>:"delay",设置采样间隔(单位:秒),默认0.5秒。示例:
perf top -d 2,每2秒刷新一次结果,降低高频采样对生产环境的性能影响。-s <field>:"sort",按指定字段排序,调整输出展示逻辑,常用字段:comm:按进程名排序,直观对比各进程CPU占比;pid:按进程ID排序,快速关联top命令找到的异常PID;dso:按模块名(如nginx、kernel、libc.so)排序,区分开销来源;示例:
perf top -s comm,按进程名排序展示CPU占比,快速识别“哪个应用最耗CPU”。
参考示例
示例1:系统级CPU热点排查
执行
perf top,输出如下:7.00% [kernel] [k] raw_spin_unlock_irqrestore 3.81% [libaqutil.so.1] [.] std::fill_n<...> 3.01% [kernel] [k] copy_user_enhanced_fast_string解读:内核自旋锁函数
raw_spin_unlock_irqrestore占比最高,需排查是否存在内核锁竞争(如多CPU场景下频繁的同步操作);libaqutil.so中的C++标准库函数占比次之,需分析该库对应的应用逻辑是否存在循环或低效算法。示例2:单进程CPU瓶颈定位(结合
-p和-g)若
top显示PID为5678的myapp进程CPU占比持续90%,执行:perf top -p 5678 -g输出可能如下:
45.23% myapp myapp [.] process_data_loop | --- process_data_loop | --- main_loop | --- main 28.11% libstdc++.so.6 [.] std::vector<...>::push_back结论:
myapp的process_data_loop函数是CPU热点,且由main_loop调用,需检查该函数是否存在死循环或低效算法(如未优化的循环逻辑)。示例3:内核热点函数解析(结合
-k)若
perf top显示内核模块占比高但函数名是内存地址,执行:perf top --kernel -k /usr/lib/debug/lib/modules/$(uname -r)/vmlinux输出可正确显示内核函数名:
12.5% [kernel] [k] net_rx_action 8.3% [kernel] [k] __softirq_entry结论:内核网络收包处理函数
net_rx_action占比高,可能存在网络包风暴或网卡驱动性能问题,需结合网络流量和驱动版本进一步排查。
注意:
执行
perf命令通常需要root权限(或普通用户需配置perf_event权限),生产环境建议用sudo执行,例如sudo perf top。若输出中函数名显示为内存地址(而非符号),需确认是否安装了对应模块的调试符号包(如内核调试包、应用的debug版本),或通过
-k选项指定符号表路径。排查到热点函数后,需结合代码逻辑或模块文档进一步分析(如内核函数可查Linux源码,应用函数需查看业务代码),才能最终定位性能瓶颈的根因。