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



性能分析是程序性能優(yōu)化的核心和基礎(chǔ)。直接通過分析代碼是很難確定性能好壞的,通常需要使用實驗或理論方法對程序性能進行較為準確的測量和分析。本節(jié)主要介紹的是其中的基礎(chǔ)理論部分,包括程序性能分析的視角和程序性能分析的方法兩部分。
程序性能分析的視角
對于程序的性能來說可以從多個角度對它進行分析,其中從硬件層面分析和從軟件層面分析是常用的兩個視角。從硬件層面分析可理解為從硬件到內(nèi)核到系統(tǒng)調(diào)用再到應(yīng)用程序的自內(nèi)向外的分析視角,從軟件層面分析是指從應(yīng)用程序到系統(tǒng)調(diào)用到內(nèi)核到硬件的自外到內(nèi)的分析視角。

從硬件層面分析時,是以系統(tǒng)硬件資源的分析為起點,涉及到的系統(tǒng)硬件資源有處理器、內(nèi)存、磁盤、網(wǎng)卡、總線以及之間的互聯(lián)等。具體可以從影響性能的硬件資源配置方面展開分析。例如系統(tǒng)有多大的可擴展性、處理并發(fā)的能力、系統(tǒng)最大容量、系統(tǒng)可能的性能瓶頸以及通過更換或擴展哪些設(shè)備可以提高系統(tǒng)整體能力等??梢愿鶕?jù)現(xiàn)有硬件資源信息,或者監(jiān)測系統(tǒng)資源的占用情況,全面掌握硬件資源的可用情況。
從軟件層面分析就是從程序的角度出發(fā),通過調(diào)整程序中的算法與代碼實現(xiàn)、系統(tǒng)設(shè)置或硬件配置等方法提高整體的性能表現(xiàn)。軟件層面分析期望的是通過程序性能表現(xiàn)這一“現(xiàn)象”,來準確的定位影響程序性能原因的“本質(zhì)”,并通過使用針對性的優(yōu)化手段達到性能優(yōu)化的目的。從軟件層面對程序進行分析,通過優(yōu)化人員對系統(tǒng)進行軟硬一體的聯(lián)調(diào),可以解決許多類似的性能問題。例如使用大量資源后不釋放、頻繁的I/O操作、程序執(zhí)行時頻繁的緩存不命中、程序中語句執(zhí)行效率低等。
程序性能分析的方法
程序性能分析的目的是對當前程序的性能進行評估,分析出當前的程序性能與理論性能之間的差異,并找出程序性能提升的方法。常用的程序性能分析理論方法包括分段查找方法、等待排列方法和little估算方法。
分段查找
進行程序性能分析之前需要首先定位導(dǎo)致程序性能瓶頸產(chǎn)生的原因,才能針對性的開展后續(xù)的優(yōu)化。分段查找是常用定位程序分析代碼段的方法之一,可以在時間或空間層面進行,主要思想是根據(jù)需要獲取某段代碼的執(zhí)行信息并進行分析,查找問題所在。
等待排隊
等待排隊可以抽象為辦理業(yè)務(wù)排隊直到業(yè)務(wù)辦理結(jié)束所耗費的整體時間。對應(yīng)于程序則為程序進入就緒隊列到程序執(zhí)行完成所耗費的時間。等待排隊方法主要分析等待進程數(shù)以及進程需等待多久。
little估算
little定律的等式為:L=λ*W。其中變量的意思是L 表示在一段時間內(nèi)排隊系統(tǒng)中的平均任務(wù)或項目數(shù)量即排隊隊列中的任務(wù)數(shù),λ表示在規(guī)定的時間間隔內(nèi)新進入系統(tǒng)的平均任務(wù)或項目數(shù)量即新任務(wù)到達率,W 表示任務(wù)或項目在整個系統(tǒng)中花費的平均時間即任務(wù)的平均花費時間。
程序性能的測量
運用程序性能分析的視角及方法的目的是找到程序性能瓶頸的大概方位,或者分析出程序中制約性能表現(xiàn)的位置。其本質(zhì)是一種猜測或估算,并不能精準的定位或給出定量的數(shù)據(jù)。
程序性能測量的信息類型
概要形式
概要形式是以匯總或者平均值的形式來展示一段時間的程序信息,必須等待一段時間來獲取信息,是比較費時的。其特點是比較適合掌握初步信息,以及用來追溯調(diào)查過去的概況,比如處理器使用率高、I/O的平均響應(yīng)時間長等現(xiàn)象。
事件記錄形式
事件記錄形式是逐個記錄每個事件,生成系統(tǒng)信息。使用事件記錄形式來分析性能情況的時候,需要在同一臺計算機下進行測量并且可以跟蹤出發(fā)與到達,并不能記錄程序處理的過程,跟蹤過程產(chǎn)生的數(shù)據(jù)量較大,對系統(tǒng)造成的壓力也相應(yīng)變得很大,可以在確定了某個范圍后,來查看詳細信息。優(yōu)點在于可以獲得關(guān)于時間、位置等詳細的信息,缺點是在核對進程到達和出發(fā)時會比較費時,效率較低。
快照形式
快照形式是記錄當前信息的方式,來生成性能信息。例如可以顯示進程的瞬間狀態(tài)。優(yōu)點是比較適合查找引起性能問題的原因。
程序性能分析的工具類型
Linux性能觀測工具按類別可分為系統(tǒng)級別和進程級別,系統(tǒng)級別是對整個系統(tǒng)的性能做統(tǒng)計,而進程級別則可以具體到某個進程的信息。按實現(xiàn)原理可分為四種類型,分別是計數(shù)器、跟蹤、剖析和監(jiān)視類型。
計數(shù)器類型
在系統(tǒng)內(nèi)核中,一般會生成一些用于對事件發(fā)生次數(shù)進行計數(shù)的統(tǒng)計數(shù)據(jù),稱為計數(shù)器。通常計數(shù)器為無符號的整型數(shù),事件發(fā)生時遞增。計數(shù)器的使用可以認為是零開銷的,因為它們默認就是開啟的,而且始終由操作系統(tǒng)內(nèi)核維護,唯一的使用開銷是從用戶空間讀取它們的時候。計數(shù)器類型的實用工具有例如內(nèi)存統(tǒng)計工具vmstat、磁盤使用情況統(tǒng)計工具iostat、處理器使用率統(tǒng)計工具top、進程統(tǒng)計信息工具ps。
跟蹤類型
跟蹤工具是跟蹤收集每個事件的數(shù)據(jù),然后供性能分析。一般情況下,跟蹤工具的話是默認不啟用。因為跟蹤工具捕獲存儲數(shù)據(jù)數(shù)據(jù)會有開銷,需要很大的存儲空間來存放跟蹤的數(shù)據(jù)。此類工具類型有跟蹤調(diào)試工具gdb、用來跟蹤進程棧的pstack、常用來跟蹤進程執(zhí)行的系統(tǒng)調(diào)用和接收的信號的strace。
剖析類型
性能剖析通常是按照特定的時間間隔對系統(tǒng)的狀態(tài)進行采樣,然后對這些樣本進行分析與研究。例gprof,oneAPI,perf,nvprof。
性能剖析通常是按照特定的時間間隔對系統(tǒng)的狀態(tài)進行采樣,然后對這些樣本進行分析與研究。性能剖析的目標是尋找性能瓶頸,查找引發(fā)性能問題的原因及熱點代碼。源程序首先被插入將用于性能測試的代碼,代碼插入的工作原理是讓編譯器修改函數(shù)調(diào)用,并插入代碼以記錄這些調(diào)用、調(diào)用者或者完整調(diào)用棧以及可能需要的時間信息。插入代碼之后,程序再運行,最后得到結(jié)果。結(jié)果中包含程序分析所需要的信息。

性能監(jiān)視記錄了一段時間內(nèi)的性能統(tǒng)計數(shù)據(jù)。通過性能監(jiān)視,可以將過去的記錄信息和現(xiàn)在的做比較,這樣就能夠找出程序基于時間的運行規(guī)律。Linux監(jiān)視工具有很多,比如監(jiān)控處理器可以使用sar,監(jiān)控內(nèi)存可以使使用vmstat、sar,監(jiān)控磁盤I/O可以使用iostat、iotop,監(jiān)控網(wǎng)絡(luò)I/O可以使用netstat、sar。
