进行缓存未命中的概要分析

perf record基本上是将概要事件和概要对象的命令指定为参数。一般来说,如果指定测量对象的基准测试软件或stress命令,则基准测试软件结束时perf tools也自动结束。例如,在下列命令中运行称为stress的命令10秒钟,并记录其概要信息。


perf record-e cache-misses stress-c 8-i 2-m 2—timeout 10s

stress:info:[12035]dispatching hogs:8 cpu,2 io,2 vm,0 hdd

stress:info:[12035]successful run completed in 10s

[perf record:Woken up 1 times to write data]

[perf record:Captured and wrote 0.450 MB perf.data(~19640 samples)]


记录的概要结果可以使用perf report命令来查看。

perf report

启动perf report命令就会如图8-1所示在TUI(文本用户界面)的界面上显示概要结果。

进行缓存未命中的概要分析 - 图1

图 8-1 perf report命令启动后

概要结果中显示了在哪个执行文件、库或者内核的哪个函数发生了缓存未命中。根据这个结果,与汇编程序(assembler)源代码进行对比时,将光标(cursor)移动到想要查看详细内容的行,按下【Enter】键就可以打开子窗口(见图8-2)。

进行缓存未命中的概要分析 - 图2

图 8-2 perf report的子窗口

在这里选择“Annotate__alloc_pages_nodemask”的项目,就会显示包括事件发生位置周边的反汇编程序在内的详细报告(见图8-3)。当分析对象(这里为内核)具有调试信息时,还会显示C的源代码和事件发生的行。本节是以分析内核中的缓存未命中为例的,此外还可以分析用户空间的应用程序。

进行缓存未命中的概要分析 - 图3

图 8-3 显示详细报告

在这个示例中,可以看出地址ffffffff810fd893的mov命令发生了缓存未命中。在这个界面按【Tab】键就会依次显示相同文件内的不同缓存未命中的位置。另外,按左箭头键可以返回与图8-1相同的画面。如果选择图8-2的项目中的“Zoom into stress(12047)thread”,就会如图8-4所示仅显示与选择的事件在相同线程内的缓存未命中。

进行缓存未命中的概要分析 - 图4

图 8-4 仅显示与线程相关的事件

要从这里返回图8-1的界面,同样需要按左箭头键。如果选择图8-2的项目中的“Zoom into the kernel DSO”,则仅显示内核中发生的缓存未命中。关于键盘操作,可以按【?】键,就会出现如图8-5所示的帮助界面,可以作为参考。

进行缓存未命中的概要分析 - 图5

图 8-5 键盘帮助