自编教材分享:第三章—程序性能的分析和测量(一)



性能分析是程序性能优化的核心和基础。直接通过分析代码是很难确定性能好坏的,通常需要使用实验或理论方法对程序性能进行较为准确的测量和分析。本节主要介绍的是其中的基础理论部分,包括程序性能分析的视角和程序性能分析的方法两部分。
程序性能分析的视角
对于程序的性能来说可以从多个角度对它进行分析,其中从硬件层面分析和从软件层面分析是常用的两个视角。从硬件层面分析可理解为从硬件到内核到系统调用再到应用程序的自内向外的分析视角,从软件层面分析是指从应用程序到系统调用到内核到硬件的自外到内的分析视角。

从硬件层面分析时,是以系统硬件资源的分析为起点,涉及到的系统硬件资源有处理器、内存、磁盘、网卡、总线以及之间的互联等。具体可以从影响性能的硬件资源配置方面展开分析。例如系统有多大的可扩展性、处理并发的能力、系统最大容量、系统可能的性能瓶颈以及通过更换或扩展哪些设备可以提高系统整体能力等。可以根据现有硬件资源信息,或者监测系统资源的占用情况,全面掌握硬件资源的可用情况。
从软件层面分析就是从程序的角度出发,通过调整程序中的算法与代码实现、系统设置或硬件配置等方法提高整体的性能表现。软件层面分析期望的是通过程序性能表现这一“现象”,来准确的定位影响程序性能原因的“本质”,并通过使用针对性的优化手段达到性能优化的目的。从软件层面对程序进行分析,通过优化人员对系统进行软硬一体的联调,可以解决许多类似的性能问题。例如使用大量资源后不释放、频繁的I/O操作、程序执行时频繁的缓存不命中、程序中语句执行效率低等。
程序性能分析的方法
程序性能分析的目的是对当前程序的性能进行评估,分析出当前的程序性能与理论性能之间的差异,并找出程序性能提升的方法。常用的程序性能分析理论方法包括分段查找方法、等待排列方法和little估算方法。
分段查找
进行程序性能分析之前需要首先定位导致程序性能瓶颈产生的原因,才能针对性的开展后续的优化。分段查找是常用定位程序分析代码段的方法之一,可以在时间或空间层面进行,主要思想是根据需要获取某段代码的执行信息并进行分析,查找问题所在。
等待排队
等待排队可以抽象为办理业务排队直到业务办理结束所耗费的整体时间。对应于程序则为程序进入就绪队列到程序执行完成所耗费的时间。等待排队方法主要分析等待进程数以及进程需等待多久。
little估算
little定律的等式为:L=λ*W。其中变量的意思是L 表示在一段时间内排队系统中的平均任务或项目数量即排队队列中的任务数,λ表示在规定的时间间隔内新进入系统的平均任务或项目数量即新任务到达率,W 表示任务或项目在整个系统中花费的平均时间即任务的平均花费时间。
程序性能的测量
运用程序性能分析的视角及方法的目的是找到程序性能瓶颈的大概方位,或者分析出程序中制约性能表现的位置。其本质是一种猜测或估算,并不能精准的定位或给出定量的数据。
程序性能测量的信息类型
概要形式
概要形式是以汇总或者平均值的形式来展示一段时间的程序信息,必须等待一段时间来获取信息,是比较费时的。其特点是比较适合掌握初步信息,以及用来追溯调查过去的概况,比如处理器使用率高、I/O的平均响应时间长等现象。
事件记录形式
事件记录形式是逐个记录每个事件,生成系统信息。使用事件记录形式来分析性能情况的时候,需要在同一台计算机下进行测量并且可以跟踪出发与到达,并不能记录程序处理的过程,跟踪过程产生的数据量较大,对系统造成的压力也相应变得很大,可以在确定了某个范围后,来查看详细信息。优点在于可以获得关于时间、位置等详细的信息,缺点是在核对进程到达和出发时会比较费时,效率较低。
快照形式
快照形式是记录当前信息的方式,来生成性能信息。例如可以显示进程的瞬间状态。优点是比较适合查找引起性能问题的原因。
程序性能分析的工具类型
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别是对整个系统的性能做统计,而进程级别则可以具体到某个进程的信息。按实现原理可分为四种类型,分别是计数器、跟踪、剖析和监视类型。
计数器类型
在系统内核中,一般会生成一些用于对事件发生次数进行计数的统计数据,称为计数器。通常计数器为无符号的整型数,事件发生时递增。计数器的使用可以认为是零开销的,因为它们默认就是开启的,而且始终由操作系统内核维护,唯一的使用开销是从用户空间读取它们的时候。计数器类型的实用工具有例如内存统计工具vmstat、磁盘使用情况统计工具iostat、处理器使用率统计工具top、进程统计信息工具ps。
跟踪类型
跟踪工具是跟踪收集每个事件的数据,然后供性能分析。一般情况下,跟踪工具的话是默认不启用。因为跟踪工具捕获存储数据数据会有开销,需要很大的存储空间来存放跟踪的数据。此类工具类型有跟踪调试工具gdb、用来跟踪进程栈的pstack、常用来跟踪进程执行的系统调用和接收的信号的strace。
剖析类型
性能剖析通常是按照特定的时间间隔对系统的状态进行采样,然后对这些样本进行分析与研究。例gprof,oneAPI,perf,nvprof。
性能剖析通常是按照特定的时间间隔对系统的状态进行采样,然后对这些样本进行分析与研究。性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。源程序首先被插入将用于性能测试的代码,代码插入的工作原理是让编译器修改函数调用,并插入代码以记录这些调用、调用者或者完整调用栈以及可能需要的时间信息。插入代码之后,程序再运行,最后得到结果。结果中包含程序分析所需要的信息。

性能监视记录了一段时间内的性能统计数据。通过性能监视,可以将过去的记录信息和现在的做比较,这样就能够找出程序基于时间的运行规律。Linux监视工具有很多,比如监控处理器可以使用sar,监控内存可以使使用vmstat、sar,监控磁盘I/O可以使用iostat、iotop,监控网络I/O可以使用netstat、sar。
