perf-list
perf-stat
perf-top

perf-record
perf-report
为了在Linux环境中对perf工具进行简单的应用,编写一个程序来分析perf子工具的具体分析结果
1.perf list
使用 perf list 命令可以列出所有能够触发 perf 采样点的事件,可以将它们划分为三类:
Hardware Event 是由 PMU 硬件产生的事件,比如 cache 命中,当您需要了解程序对硬件特性的使用情况时,便需要对这些事件进行采样;
Software Event 是内核软件产生的事件,比如进程切换,tick 数等 ;
Tracepoint event 是内核中的静态 tracepoint 所触发的事件,这些 tracepoint 用来判断程序运行期间内核的行为细节,比如 slab 分配器的分配次数等。
2.perf-stat
用于分析指定程序的性能概况。有些程序慢是因为计算量太大,其多数时间都应该在使用 CPU 进行计算,这叫做 CPU bound 型;有些程序慢是因为过多的 IO,这种时候其 CPU 利用率应该不高,这叫做 IO bound 型;对于 CPU bound 程序的调优和 IO bound 的调优是不同的。
可以对于一个指定的性能事件(默认是CPU周期),显示消耗最多的函数或指令。
通过对他程序的分析,可以看出它是一个 CPU bound 型,因为 task-clock-msecs 接近 1
Task-clock-msecs:CPU 利用率,该值高,说明程序的多数时间花费在 CPU 计算上而非 IO。
Context-switches:进程切换次数,记录了程序运行过程中发生了多少次进程切换,频繁的进程切换是应该避免的。
CPU-migrations:表示进程 t1 运行过程中发生了多少次 CPU 迁移,即被调度器从一个 CPU 转移到另外一个 CPU 上运行。
page-fault:缺页异常,linux内存管理子系统采用了分页机制
Cycles:处理器时钟,一条机器指令可能需要多个 cycles,
Cache-references: cache 命中的次数
Cache-misses: cache 失效的次数。
3.perf top
主要用于实时分析各个函数在某个性能事件上的热度,能够快速的定位热点函数,包括应用程序函数、模块函数与内核函数,甚至能够定位到热点指令。
第一列为该符号引发的性能事件在整个监测域中占的比例,称为该符号的热度。监测域是指 perf 监控的所有符号。默认情况下包括系统中所有进程、内核以及内核模块的函数。 第二列为该符号所在的 DSO。 DSO 即动态共享对象(Dynamic Shared Object)的缩写。第 3 列为 DSO 的类型。 perf 中 DSO 共有 5种类型,分别是: ELF 可执行文件,动态链接库,内核,内核模块, VDSO 等。当第 3 列为 [.]时表示此符号属于用户态的 ELF 文件(包括可执行文件与动态链接库)。为[k]表示此符号属于内核或内核模块。最后一列是函数名。
4.perf-record
收集采样信息,并将其记录在数据文件中。随后可以通过其它工具(perf-report)对数据文件进行分析,结果类似于perf-top的。
使用 top 和 stat 之后,要进一步分析,便需要一些细节的信息。比如说您已经断定目标程序计算量较大,也许是因为有些代码写的不够精简。面对长长的代码文件,要进行哪一行或哪一句的优化。这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果。调优应该将注意力集中到百分比高的热点代码片段上,
5.perf-report
读取perf record创建的数据文件,并给出热点分析结果。
热点函数 是 longa( ) 。通过分析报告,我们就会找到调优的方向。
小结
perf是一个庞大的Linux性能分析工具。各种命令的使用相当灵活,熟练地掌握和利用将有助于我们对程序性能的改善。以上介绍的这些 perf 用法主要着眼点在于对于应用程序的性能统计分析我们还可以将它用于内核代码的分析。