HACK#65 使用perf tools的概要分析(2)
本节介绍使用perf tools进行详细概要分析的方法。
Hack#64介绍了使用perf top进行及时系统概要分析的方法。这里将进一步介绍实际的概要分析技术,使用perf tools的其他功能,获取更详细的概要,特别是在x86命令代码或C语言源代码层面追踪热点(hot spot)的方法。
使用perf进行概要分析的步骤
perf top通过一条命令就可以进行概要分析,而perf tools的其他子命令则基本上是按照下列步骤进行概要分析。
1.选定概要事件。
2.记录概要分析和数据。
3.分析记录的数据。
因此,首先从使用perf list显示的事件列表中,决定使用哪个事件,然后使用perf record记录事件,最后使用perf report或perf annotate进行详细的事件信息分析。关于进行概要分析的事件请参考Hack#64中的表8-1。除了表8-1介绍的事件以外,有些处理器还可以在L1缓存信息、TLB缓存信息等更为详细的信息的基础上进行概要分析。这里将介绍对发生了缓存未命中的位置进行详细概要分析的方法。perf record命令需要使用下列方法之一指定进行概要分析的对象来执行。
·通过进程ID指定(—pid)。
·通过线程ID指定(—tid)。
·指定特定CPU上的所有进程(—profile_cpu)。
·指定所有CPU上的进程(—all)。
·从命令行指定要执行的命令。
然后与perf top一样,指定属于所记录种类的事件并将启动。例如,要对所有CPU上发生的缓存未命中进行概要分析时,进行下列操作。
perf record-e cache-misses—all
可以在事件的“:”后面传递选项。
perf record-e cache-misses:k—all
表8-2所示为x86上可以传递给事件的选项。
使用PEBS和LBR的正确采样
PEBS为Precise Event Based Sampling的缩写,是从Intel Core微架构(与NetBurst中的一部分)开始导入的更为准确的性能计数器结构。虽然可以适用PEBS的事件有限,但是对于找出事件准确的发生地址是非常有用的。在此之前的性能计数器都是在事件发生后造成外部中断,因此发生中断的时间比事件发生时命令的地址稍靠后。因此从中断处理程序可以看到的IP寄存器显示的地址并不是正确的地址。而PEBS则可以在事件发生后立刻造成异常,从而能获取事件发生时命令运行的地址。但是,事件发生的命令本身已经运行,因此IP寄存器显示的值就是事件发生的命令的下一条命令的地址。
x86架构采用了CISC命令,各命令的长度各不相同,当事件发生的命令为分支命令时,难以从分支的节点找出从哪里分出的,仅使用PEBS很难正确地找到事件发生的命令。
在perf tools中将这个功能和LBR(Last Branch Record)配合使用,通过逆运算求出事件实际发生的命令的地址。LBR是记录最后执行分支命令的地址的功能。PEBS如果在事件发生后立即调用处理程序,则首先参照LBR。LBR中记录了最后分支的起点和终点的地址,当IP寄存器显示的地址与LBR显示的分支终点地址一致时,分支起点地址就是真正的事件发生地址。
当与LBR的信息不一致时,PEBS处理程序对从分支终点的地址到IP寄存器显示的地址为止的各命令依次进行解码,找出到达IP寄存器显示地址前的一个命令的地址。这样就可以得知事件真正发生的地址。
但是,在使用有些处理器时是无法启用这些功能的。这时就会返回-ENOTSUPP错误。PEBS的功能对于某些类型的事件也不能使用。在使用时需要注意。