性能优化工具
关于常用的性能优化工具的一些笔记。主要内容是perf,vtune。
perf的参考文档:
https://perf.wiki.kernel.org/index.php/Tutorial
一.Linux Perf
Perf可以直接用以下命令安装:
1 | sudo apt install linux-tools-common |
如果安装后perf —version找不到,就下载内核版本的源码(uname -r看版本),在源码的/tools/perf下执行make
,make install
,执行完以后可能还是没有perf,将文件夹里面的perf移动到/bin和/home/user_name/bin里面就可以了。
1.概述
Perf是Linux系统上的一个性能分析工具,是基于Linux内核的perf_events实现的。
命令
最常用的perf命令有stat,record和report,还有许多其他命令,直接运行perf就可以看到了。每个命令的具体选项通过perf cmd -h
查看。
Events
perf支持一系列可测量的事件。测量接口来自内核,内核计数器触发的事件称为软事件,包括上下文切换等。还有硬件触发的来自Performance Monitoring Unit(PMU)的事件。这些事件是微体系结构下的,包括时钟数,缓存未命中,退役指令等。这样的事件称为PMU硬件事件。还有一些tracepoint事件是内核的ftrace实现的,只有2.6.3x以后的内核才支持。
PMU硬件事件是每个CPU可能不同的,intel的PMU events table: Appendix A,AMD的: Section 3.14。
执行perf list
可以得到支持的事件列表。
2.使用perf stat
Options controlling event selection
对于支持的事件,perf可以在进程执行时进行计数,并产生分析数据。
直接执行perf stat program_name
会输出一些常见的事件。
1 | root@ubuntu:/home/y/hpc/perf# perf stat ./case0 |
这里随便选了一个程序,比较简单,而且和tutorial中的比起来,该版本的perf默认没给出缓存相关的数据。
perf stat -e events:u/k
可以指定事件,后面的u/k表示测量用户的部分或内核的部分,默认是这两部分都测量,或者显式events:uk指定两部分都测量。
要测量多个事件,直接写在-e后面就可以了:
1 | perf stat -e cycles,instructions,cache-misses [...] |
这里发现虚拟机怎么测cache-misses之类的数据都是0,可能是虚拟机没有正常提供PMU接口(存疑)。
multiplexing and scaling events
如果事件比counters多,内核会使用时分复用,给每个事件监测硬件事件的机会。这个复用是只针对硬件事件的。事件的count计算的方式如下:
final_count = raw_count * time_enabled/time_running
每个事件只在一定的时间段被测量,所以数据并不是完全准确的,而是估计值。perf会根据事件占用counter的时间比例来对数据进行缩放,得到更接近真实值的结果。
例如stat结果是:
1 | 2,809,725,593 cycles (scaled from 74.98%) |
后面的缩放因子74.98%就表示该事件只被测量了74.98%的时间。
时间复用会增加事件切换的开销,会影响程序的执行,要得到更准确的数据,应该尽量减少想要测量的事件数量。
repeated measurement
perf stat可以重复多次测量,只需要添加-r round
就可以了。
Options controlling environment selection
perf可以统计事件的不同范围,比如单个线程,单个进程,单个CPU。单个线程下,只监测指定线程的执行,单个进程下只监测进程及其子进程的执行。以下选项可以控制这些模式:
- -i,—no-inherit:只统计进程本身的事件,不包括子进程
- -p,—pid
:统计指定进程id的进程的事件 - -t,—tid
:统计指定线程的事件 - -a,—all-cpus:统计所有CPU事件
以下是一些示例:
1 | perf stat -e cycles -C 0 ./test #统计在CPU0上的事件 |
Options controlling output
-B可以输出US-style的数值(按千进行分位),-x可以输出CSV格式的数据。
3.使用perf record
record命令可以产生一个perf.data文件,可以进一步进行分析(使用report和annotate)。
Event-based sampling overview
perf events是基于事件采样的,当采样计数器溢出时,就会记录一个样本。在计数器溢出时,内核记录了程序执行的信息,即一个样本。记录什么取决于测量的类型。这些都由用户和工具指定。但是所有样本中共有的关键信息是指令指针,即程序被中断时所在的位置。
基于中断的采样会发生偏移,因为样本中的指针是处理PMU中断的位置,而不是计数器实际溢出时的位置,所以在指令级别分析结果是,要注意偏移。
默认情况下,perf record使用cycles作为采样事件。以每个线程模式运行,会监测子线程。
4.使用perf report进行分析
perf report可以读入perf record的结果进行分析。默认情况下采样是按照函数排序的。
1 | perf report |
Overhead列表示在相应函数中收集的总样本数的百分比。“Command”列报告了收集样本的进程。“Shared Object”列显示了样本来自的ELF镜像的名称。如果一个程序是动态链接的,那么这可能会显示共享库的名称。当样本来自内核时,那么使用伪ELF镜像名称[kernel.kallsyms]。“Symbol”列指示了采样时的特权级别,即程序在被中断时运行的级别:
- .:用户级
- k:内核级
- g:客户机内核级别
- u:客户机操作系统用户空间
- H:hypervisor
Overhead可以有两个列,分别为children和self,self是函数自身的采样周期占比,而children是将所有子函数相加来计算的。添加--children
选项就可以开启self这一列,默认的Overhead是children,即包含调用子函数的内容。
1 | Children Self Symbol |
5.使用perf annotate进行源码级别的分析
为了使perf找到源码和符号信息,编译时要添加-g选项。
perf annotate可以显示每一行代码或指令在采样事件中的占比及相关数据。
使用perf annotate需要先使用perf record命令保存数据,然后就可以用perf annotate来读取perf.data文件,并显示注释后的代码,-s选项可以指定函数或符号,也可以使用默认的最热点的函数和符号。
一些控制选项包括:-stdio可以输出纯文本格式,-source可以显示源码而不是汇编代码。
6.尝试使用perf
阅读tutorial后,最重要的还是要实际尝试一下使用perf。重点需要尝试的是report和annotate。
首先进行record:
1 | perf record -F 999 ./a #-F指定的是采样频率,每秒999次,不选整数是提高随机性,避免采样与周期性事件重合 |
然后report看分析结果,这里又出现了问题,report的结果没有显示函数名,而是显示地址,发现是组件没有安装完全。回到perf的源码进行make,根据提示安装组件。然后再report,这次终于正确的进入了perf。
1 | Samples: 26 of event 'cycles', Event count (approx.): 48071029 |
光标可以移动,enter后再选择annotate就可以进入函数,看汇编级的hot code了:
1 | ea 0x0(,%rax,4),%rdx |
如果想要直接找到在函数中的位置,而不是汇编级指令,单独执行命令perf annotate —stdio —symbol=函数名就可以看到函数中的hotcode数据(编译时需要添加-g):
1 | : 17 long long dot_product(int *a, int *b){ |
二.Vtune Profiler
Vtune是intel开发的性能分析工具。支持windows,linux,macos平台。
在自己的PC安装Vtune,提示以下内容:
1 | This analysis type is not applicable to the system because VTune Profiler cannot recognize the processor. If this is an old Intel processor, please refer to the minimum hardware requirements in the release note. If this is a new Intel processor, please check for an updated version of VTune Profiler. If this is an unreleased Intel processor, please contact Online Service Center for an NDA product package. |
想起来自己的笔记本是AMD处理器,问了一下new bing Vtune是否支持AMD处理器,回答是这样的:
1 | 根据我搜索到的信息,AMD Ryzen 5 4600H 处理器是一款基于 Zen 2 微架构的 7 纳米处理器,它支持 SMT(同时多线程)技术,拥有 6 个物理核心和 12 个逻辑核心1。它的主频为 3.0 GHz,最大睿频为 4.0 GHz2。它还集成了 Radeon RX Vega 6 图形核心,拥有 6 个计算单元和 384 个流处理器2。 |
先下载个AMD Ryzen Master。结果是不支持当前处理器,去查了一下,移动端是不能使用这个工具的(?不能随便超频),因此没办法尝试了。