快捷搜索:  汽车  科技

linux性能分析教程交流:Linux性能分析工具perf

linux性能分析教程交流:Linux性能分析工具perf为了在Linux环境中对perf工具进行简单的应用,编写一个程序来分析perf子工具的具体分析结果perf-reportperf-statperf-topperf-record

一、什么是perf

Perf 是用来进行软件性能分析的工具。通过它应用程序可以利用 PMU(performance monitoring unit),tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题,也可以用来分析内核的性能问题,也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。可以帮助我们进行算法优化(空间复杂度、时间复杂度)、代码优化(提到执行速度、减少内存占用)。

二、perf的工作原理

Perf 是内置于 Linux 内核源码树中的性能剖析工具。它基于事件采样原理,以性能事件为基础(主要指CPU周期),支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位。

三、perf 工具

Linux内核自带了一个性能分析工具perf,能够进行函数级与指令级的热点查找,Perf是一个包含22种子工具的工具集,以下是最常用的5种:

perf-list

perf-stat

perf-top

perf-record

perf-report

为了在Linux环境中对perf工具进行简单的应用,编写一个程序来分析perf子工具的具体分析结果

linux性能分析教程交流:Linux性能分析工具perf(1)

1.perf list

使用 perf list 命令可以列出所有能够触发 perf 采样点的事件,可以将它们划分为三类:

Hardware Event 是由 PMU 硬件产生的事件,比如 cache 命中,当您需要了解程序对硬件特性的使用情况时,便需要对这些事件进行采样;

Software Event 是内核软件产生的事件,比如进程切换,tick 数等 ;

Tracepoint event 是内核中的静态 tracepoint 所触发的事件,这些 tracepoint 用来判断程序运行期间内核的行为细节,比如 slab 分配器的分配次数等。

linux性能分析教程交流:Linux性能分析工具perf(2)

2.perf-stat

用于分析指定程序的性能概况。有些程序慢是因为计算量太大,其多数时间都应该在使用 CPU 进行计算,这叫做 CPU bound 型;有些程序慢是因为过多的 IO,这种时候其 CPU 利用率应该不高,这叫做 IO bound 型;对于 CPU bound 程序的调优和 IO bound 的调优是不同的。

可以对于一个指定的性能事件(默认是CPU周期),显示消耗最多的函数或指令。

linux性能分析教程交流:Linux性能分析工具perf(3)

通过对他程序的分析,可以看出它是一个 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

主要用于实时分析各个函数在某个性能事件上的热度,能够快速的定位热点函数,包括应用程序函数、模块函数与内核函数,甚至能够定位到热点指令。

linux性能分析教程交流:Linux性能分析工具perf(4)

第一列为该符号引发的性能事件在整个监测域中占的比例,称为该符号的热度。监测域是指 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

linux性能分析教程交流:Linux性能分析工具perf(5)

读取perf record创建的数据文件,并给出热点分析结果。

热点函数 是 longa( ) 。通过分析报告,我们就会找到调优的方向。

小结

perf是一个庞大的Linux性能分析工具。各种命令的使用相当灵活,熟练地掌握和利用将有助于我们对程序性能的改善。以上介绍的这些 perf 用法主要着眼点在于对于应用程序的性能统计分析我们还可以将它用于内核代码的分析。

猜您喜欢: