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