【性能】基于Perf和VTune的程序性能瓶颈分析
原文:https://www.eefocus.com/embedded/479299
本文首先介绍了对应用程序进行分析的 3 个指标,然后介绍了 Linux 系统工具、Perf 以及 Vtune 工具的使用,尤其重点描述了如何利用 Perf 和 VTune 工具对程序进行剖析,寻找程序的性能瓶颈。利用好这些性能调优工具,能够快速定位程序的性能热点以指导程序的性能瓶颈优化。
1、引言
应用程序的开发测试过程中,对程序性能进行分析和优化是不可或缺的一部分。性能分析(performance analysis 也称为 profiling),是以收集程序运行时信息为手段研究程序行为的分析方法,是一种动态程序分析的方法。性能分析的目的在于决定程序的哪个部分应该被优化,从而提高程序的速度或者内存使用效率。根据帕累托法则(也叫二八定律),只有优化处于性能瓶颈的那些少量代码,才能用最小的成本获得最大的收益。
本文首先介绍了衡量应用程序性能的关键指标,随后介绍如何使用 perf 和 vtune 进行性能分析,找到软件性能的热点部分。完成应用程序的性能分析并找到性能瓶颈后,能够快速精准的定位到需要修改的源码,缩短性能调优的时间。
2、程序性能分析指标
衡量应用程序的性能高低,需要从多个方面进行性能指标的分析,主要包括业务指标、资源指标和可靠性指标。
2.1 业务指标
(1) 响应时间
响应时间是指系统对请求作出响应的时间,可以理解为是指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束的时间,这项指标直接影响用户的感官体验。在实时互动的场景下,一般要求毫秒级的响应速度。
(2) 吞吐量
吞吐量是指单位时间内处理的请求数,常用 QPS(Queries Per Second)和 TPS(TransactionsPerSecond)进行衡量,是衡量多并发的应用系统的重要指标。
(3) 并发数
并发数指系统可以同时承载的正常使用系统功能的用户的数量。这个指标比较直观但是不是很准确,因为用户不同的使用模式会导致不同用户在单位时间发出不同数量的请求。
2.2 资源指标
(1) CPU 使用率
CPU 使用率指的是程序在运行期间实时占用的 CPU 百分比,这是对一个时间段内 CPU 使用状况的统计。通过这个指标可以看出在某一个时间段内 CPU 被占用的情况。
(2) 内存利用率
内存是计算机中重要的部件之一,它是与 CPU 进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大,内存利用率不宜过高,否则会影响系统性能。
(3) 磁盘吞吐量
磁盘指标主要有每秒读写多少兆,磁盘繁忙率,磁盘队列数,平均服务时间,平均等待时间,空间利用率。其中磁盘繁忙率是直接反映磁盘是否有瓶颈的的重要依据。
(4) 网络吞吐量
网络吞吐量是指在无网络故障的情况下单位时间内通过的网络的数据数量,单位为 Byte/s。网络吞吐量指标用于衡量系统对于网络设备或链路传输能力的需求。
2.3 可靠性指标
可靠性指在使用条件和规定时间内,产品完成规定功能的能力。常用的可靠性指标包括:可靠度、失效概率、失效率、平均工作时间、平均维修时间、有效度等。
3、程序性能分析工具
3.1 Linux 系统工具
Linux 系统上自带了许多的性能监控工具
(1) vmstat:实时动态监视操作系统的虚拟内存、进程、CPU 活动。
(2) iostat:动态监视系统的磁盘操作活动。
(3) top: 实时显示系统中各个进程的资源占用状况。
(4) sar: Linux 上最为全面的系统性能分析工具之一,可以从 14 个大方面对系统的活动进行报告。
(5) top: 实时显示系统中各个进程的资源占用状况。
3.2 Perf
Perf 是内置于 Linux 内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,使用了许多 Linux 跟踪特性,可用于行函数级与指令级的性能瓶颈的查找与热点代码的定位,。
(1)Perf top:实时显示系统 / 进程的性能统计信息
常用参数
-e:指定性能事件
-a:显示在所有 CPU 上的性能统计信息
-C:显示在指定 CPU 上的性能统计信息
-p:指定进程 PID
-t:指定线程 TID
-K:隐藏内核统计信息
-U:隐藏用户空间的统计信息
-s:指定待解析的符号信息
(2) Perf stat:分析系统 / 进程的整体性能概况。
常用参数:
-e:选择性能事件
-i:禁止子任务继承父任务的性能计数器。
-r:重复执行 n 次目标程序,并给出性能指标在 n 次执行中的变化范围。
-n:仅输出目标程序的执行时间,而不开启任何性能计数器。
-a:指定全部 cpu
-C:指定某个 cpu
-A:将给出每个处理器上相应的信息。
-p:指定待分析的进程 id
-t:指定待分析的线程 id
(3) Perf record: 记录一段时间内系统 / 进程的性能时间。
常用参数:
-e:选择性能事件
-p:待分析进程的 id
-t:待分析线程的 id
-a:分析整个系统的性能
-C:只采集指定 CPU 数据
-c:事件的采样周期
-o:指定输出文件,默认为 perf.data
-A:以 append 的方式写输出文件
-f:以 OverWrite 的方式写输出文件
-g:记录函数间的调用关系
(4) Perf Report: 读取 perf record 生成的数据文件,并显示分析数据。
常用参数:
-i:输入的数据文件
-v:显示每个符号的地址
-d :只显示指定 dos 的符号
-C:只显示指定 comm 的信息(Comm. 触发事件的进程名)
-S:只考虑指定符号
-U:只显示已解析的符号
-g[type,min,order]:显示调用关系,具体等同于 perf top 命令中的 -g
-c:只显示指定 cpu 采样信息
-M:以指定汇编指令风格显示
–source:以汇编和 source 的形式进行显示
使用 perf 对程序进行函数调用的关系分析后,统计函数的调用次数,算出百分比,可以得到进程运行的可信数据(图 1)。
图中第一列表示函数的子函数执行占用的 CPU 比例,第二列表示函数执行占用的 CPU 比例,第三列表示函数所在的 DSO,第四列表示函数名。通过使用 perf 工具,可以方便地得到定位程序的热点代码,以指导程序性能瓶颈的优化。
但是这种结果查看函数之间的调用关系十分不方便,可以使用一些脚本生成火焰图(FlameGraph)来直观地表示函数调用关系。
火焰图使用 SVG 的图像格式进行存储,方便用户与图像进行交互。火焰图中的函数方块的长度越长,那么表示执行该函数的 CPU 时间越长。火焰图的底部为父函数,上方为它的子函数。通过火焰图的形式,函数调用的关系以及 CPU 占用比都更加直观地呈现出来。
3.3 VTune
VTune 是 Intel 公司开发的的一个功能十分强大的应用程序性能分析软件,包括寻找软件性能热点、线程性能检测、CPU 利用率、IO 负载监测等功能,还提供丰富的 UI 界面供用户操作,简单易上手。
VTune 提供了本地连接、远程连接、安卓设备连接等多种方式来对不同的应用程序进行测试,还提供 Performance Snapshot、Hotpots、Microarchitecture Exploration、Threading 和 IO 等不同方面的性能分析模块(图 3)。
用户使用 VTune 进行模块分析后,可以通过 Summary、Bottom-up、Caller/Callee、Top-down TreehePlatfom5 个选项框查看性能分析结果(图 4)。
Summary:显示有关整个应用程序执行的统计信息,以分析 CPU 时间和处理器利用率。
Bottom-up:在自下而上的树中显示热点函数,每个函数的 CPU 时间和 CPU 利用率。
Top-down Tree:显示调用树中的热点函数,仅函数的性能指标(不包括子函数)以及函数及其子函数的总性能指标。
Caller/Callee:显示所选函数的父函数和子函数。
Platform:提供有关 CPU 和 GPU 利用率,帧速率,内存带宽和用户任务的详细信息。
(1)Performance Snapshot
该功能模块能够对应用程序进行总体的分析(图 4),包括 IPC、GFLOPS、CPU 频率、CPU 核心利用率、微架构使用率、内存使用率等指标等,但只能给出一个总体的数值,要分析各个函数对 CPU 的占用时间等详细数值要进行更加详细的分析,一般进行性能分析时,首先进行这个模块的分析。
(2)Hotpots
Hotspots 分析可以了解应用程序流程,并确定获得大量执行时间的代码段(热点),这是用户进行算法分析的起点。热点分析有两种基于采样的收集模式:用户模式采样会产生更高的开销,但不需要采样驱动程序即可进行收集;基于硬件事件的采样,可以提供最小的收集开销,但需要安装采样驱动程序或 Perf。在用户模式采样中,收集器不会收集系统范围内的性能数据,而是只关注您的应用程序。硬件基于事件的采样模式是基于硬件基于事件的采样收集,分析当前系统上运行的所有进程,提供关于整个系统性能的 CPU 时间数据。
在进行 Hotspots 分析后,可以查看 Bottom-up 视图下的热点函数,双击函数即可对源码以及汇编代码进行分析。
(3)Threading
Threading 分析可以用于探索 CPU 利用率低下的原因,相较于其他模块,它显示了全部的线程数量,以及各个线程的等待时间以及使用时间(图 7),使用户能够更好地把握各个线程之间的切换情况。通过这些信息,用户可以清晰地观察工作线程的实际执行过程,了解程序的实际执行逻辑,明确各个线程的工作状态与预期是否有出入。
(4)I/O
I/O 模块能够分析设备的 PCIe I/O 带宽消耗,Director I/O 技术和内存映射 I/O 流量、内存带宽消耗 Intel®UPI 带宽消耗以及软件数据平面利用率,以在硬件和软件级别上定位 I/ O 密集型应用程序的性能瓶颈。
4、结束语
随着业务的日渐复杂,程序性能优化俨然成为了每一位技术人的必修课,而程序的性能调优工作又是一个十分复杂的工作。而掌握一些常用的系统性能调优工具的使用,能更好地剖析程序,迅速而准确的找到性能热点,以指导性能瓶颈问题的解决方案设计。