Perf 内置于Linux 内核源码树中的性能剖析工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位。linux2.6及后续版本都自带该工具,几乎能够处理所有与性能相关的事件。perf top 是比较常用于展示占用CPU始终最多的函数或者指令,一般以此来查找热点函数。
实战
root@xxxx:~# apt install linux-tools-common
root@xxxx:~# perf top
Samples: 6K of event 'cycles', 4000 Hz, Event count (approx.): 48144737 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
3.84% [kernel] [k] native_write_msr
2.25% [kernel] [k] update_blocked_averages
1.89% [kernel] [k] update_sd_lb_stats.constprop.0
1.80% [kernel] [k] pvclock_clocksource_read
Samples : 采样数, perf 总共采集了 6K 个 CPU 时钟事件。
event : 事件类型。
Event count (approx.) : 事件总数量
行列:
Overhead: 是该符号的性能事件在所有采样中的比例,用百分比来表示。
Shared: Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
Object: Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
Symbol: Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
上面结果显示内核模块中native_write_msr 占用 CPU时钟最多,比列占3.84%。
同样可以使用perf record 与 perf report 进行定时采集再展示。加上 -g 参数,开启调用关系的采样,方便我们根据调用链来分析性能问题。
root@xxxx:~# perf record
^C //(结束采集)
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.967 MB perf.data (739 samples) ]
root@xxxx:~# perf report
Samples: 739 of event 'cycles', Event count (approx.): 22853303
Overhead Command Shared Object Symbol
4.38% swapper [kernel.kallsyms] [k] native_write_msr
4.04% swapper [kernel.kallsyms] [k] native_safe_halt
3.26% swapper [kernel.kallsyms] [k] update_blocked_averages
2.63% swapper [kernel.