1 perf
1.1 概述
perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫“Performance counters“的内核子系统实现,基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,可用于性能瓶颈的查找与热点代码的定位。
基本原理是perf通过系统调用sys_perf_event_open 陷入到内核中,内核根据perf 提供的信息在PMU(Performance Monitoring Unit)上初始化一个硬件性能计数器(PMC: Performance Monitoring Counter)。PMC随着指定硬件事件的发生而自动累加。在PMC 溢出时,PMU 触发一个PMI(Performance Monitoring Interrupt)中断。内核在PMI 中断的处理函数中保存PMC 的计数值,触发中断时的指令地址,当前时间戳以及当前进程的PID,TID,comm 等信息。我们把这些信息统称为一个采样(sample)。内核会将收集到的sample 放入用于跟用户空间通信的Ring Buffer。用户空间里的perf 分析程序采用mmap 机制从ring buffer 中读入采样,并对其解析。
1.2 常用命令
1)perf常用的五个命令:
- perf list:查看当前软硬件环境支持的性能事件
- perf stat:分析指定程序的性能概况
- perf top:实时显示系统/进程的性能统计信息
- perf record:记录一段时间内系统/进程的性能事件
- perf report:读取perf record生成的data文件,并显示分析数据
2)perf record常用的命令行参数:
- -e <event>:指定性能事件(可以是多个,用,分隔列表)cycles,instructions,cache-references,cache-misses,bus-cycles
- -p <pid>:指定待分析进程的 pid(可以是多个,用,分隔列表)
- -t <tid>:指定待分析线程的 tid(可以是多个,用,分隔列表)
- -u <uid>:指定收集的用户数据,uid为名称或数字
- -a:从所有 CPU 收集系统数据
- -g:开启 call-graph (stack chain/backtrace) 记录
- -C <cpu-list>:只统计指定 CPU 列表的数据,如:0,1,3或1-2
- -r <RT priority>:perf 程序以SCHED_FIFO实时优先级RT priority运行这里填入的数值越大,进程优先级越高(即 nice 值越小)
- -c <count>: 事件每发生 count 次采一次样
- -F <n>:每秒采样 n 次
- -o <output.data>:指定输出文件data,默认输出到perf.data
- -- sleep:采集时长
3)通过perf report可以展示采样记录,下图是使用ib_send_bw时,采集到的信息。
- Samples:采样个数
- Event count:系统总共发生的事件数
- Symbol:函数名,其中 [.] 表示用户空间函数,[k] 表示内核函数
- Shared Object:函数所在的共享库或所在的程序
- Command:进程名
- Self:该函数的 CPU 使用率
- Children:该函数的子函数的 CPU 使用率
1.3 perf使用示例
使用perf对RDMA传输层客户端的代码进行性能分析。
然后得到各个函数对CPU的占用率
通过对函数对CPU的占用情况,分析哪些函数占用率特别高,是否正常,并查看该函数是否存在优化的可能性。
2 vtune
2.1 概述
Vtune是一款可视化性能分析器(Intel VTune Performance Analyzer),用于分析和优化程序性能,作为Intel为开发者提供的专门针对寻找软硬件性能瓶颈的一款分析工具,它能确定程序的热点(hotspot),找到导致性能不理想的原因,从而让开发者据此对程序进行优化。
2.2 下载与安装
下载指南:
https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler-download.html
安装指南:
使用指南
支持在线和离线安装,支持linux、windows和macOS。
2.3 使用
- 命令行使用
vtune <-action> [-action-option] [-global-option] [[--] <target> [target-options]]
- 图形界面使用
可以使用vtune-gui打开图形界面,或者直接双击intel vtune profiler图标打开。
支持导入可执行程序直接执行,采集并分析数据;或者是将使用命令行采集的数据导入进行分析。
2.4 使用示例
使用vtune对RDMA传输层代码进行性能分析
- 使用vtune -collect hotspots -result-dir rdma-client -quiet命令,采集example执行过程中的数据,并将采集到的数据存在rdma-client文件夹中。
- 将采集后数据导入intel vtune profiler中进行分析。
- 分析结果呈现
- Summary
主要分析的数据有:"Elapsed Time(经过的总时间)"、"Top Hotspots(高热点部分)"、"CPU Usage Histogram(CPU使用直方图)"和"Collection and Platform Info(收集信息和平台信息)"。
Elapsed Time信息,主要有总线程数量、开销时间(花费在同步和线程库函数的时间)、自旋时间(CPU等待其它同步资源处理的自旋等待时间)、CPU时间(CPU运行程序所花费的总时间)和暂停时间。
Top Hotspots信息,会列举VTune分析的程序里的活跃度最高(最耗时)的部分,例如:自旋锁、函数等。
- Bottom-up
Bottom-up可以查看函数/模块/线程调用时间的耗费,主要分析的数据有:进程、线程、模块、函数和调用的堆栈信息。可以显示程序的进程、线程号,函数的开始地址,CPU开销时间,CPU自旋时间等信息。
导入源文件后,可以分析到具体某行函数占用cpu的时间。
- Caller/Callee
Caller/Callee主要分析的数据有:CPU总利用时间、各个函数自我利用时间、各个函数的自我开销时间、各个函数的调用者和被调用者等。
- Thread
Tasks and Frames主要以直方图的形式详细展示了各个线程的运行时间。
- Flame graph
CPU火焰图,可以看到CPU 执行的函数名以及调用栈(stack),可以清晰地看到程序中花费执行时间最长的函数。