perf record -a -g -e cycles -- sleep 10
会在当前目录下生成perf.data,第二次执行,之前的perf.data会变为perf.data.old
命令结构拆解
部分 | 含义 |
---|---|
perf record | 使用 perf 工具进行性能采样,记录性能数据到 perf.data 文件 |
-a | 系统范围采样(all CPUs),对所有 CPU 的活动进行采样 |
-g | 采样时记录调用栈信息(call graph),方便分析函数调用关系 |
-e cycles | 指定采样事件为 CPU 周期数(cycles),采集 CPU 周期相关事件 |
-- | 参数分隔符,表示后面是被采样的命令,而非 perf 参数 |
sleep 10 | 被采样的命令,这里是休眠 10 秒,perf 记录这 10 秒内的系统活动 |
采集完成之后,使用perf report -i perf.data分析本次采样数据
字段解释
字段名 | 含义 |
---|---|
Children | 包括当前函数及其所有子函数在调用链中的总耗时比例(越大代表越重要的热点路径) |
Self | 当前函数本身的耗时比例(不包括它调用的其他函数) |
Command | 执行该函数时所属的进程名,如 swapper 、php-fpm 、python3 |
Shared Object | 符号所在的二进制模块,如 libc.so.6 、php-fpm 、[kernel.kallsyms] (内核) |
Symbol | 函数名或符号名(可能是内核函数、用户态函数、系统调用等) |
小技巧:如何判断性能瓶颈
Self
占比高:说明该函数自身耗时多,可能是热点Children
占比高:说明这个函数或者它的调用链整体是热点,建议进入调用栈查看- 如果看到
libc.so
、libstdc++
、php-fpm
、python3
等用户态库或程序出现,则说明你程序本身在消耗 CPU - 如果大部分都是
swapper
和内核空闲函数,那表示系统空闲,无明显压力