建議將性能調(diào)優(yōu)集成到軟件開(kāi)發(fā)過(guò)程中。
性能問(wèn)題的現(xiàn)狀
傳統(tǒng)的軟件開(kāi)發(fā)過(guò)程:分析、設(shè)計(jì)、編碼、測(cè)試。
分析:用于評(píng)估需求、權(quán)衡各種架構(gòu)的利弊以及構(gòu)思高層抽象。
設(shè)計(jì):依據(jù)分析階段的基本架構(gòu)和高層抽象,進(jìn)行更精細(xì)的抽象并著手考慮具體實(shí)現(xiàn)。
測(cè)試:通常只包含功能測(cè)試。

遵循傳統(tǒng)軟件開(kāi)發(fā)過(guò)程的應(yīng)用,通常要到測(cè)試或即將發(fā)布時(shí)才會(huì)關(guān)注性能或擴(kuò)展性。

對(duì)于分析階段提煉出來(lái)的性能需求,建議以用例的方式特別標(biāo)識(shí)出來(lái),這有助于在分析階段制定性能評(píng)估指標(biāo)。
性能測(cè)試階段:基準(zhǔn)測(cè)試 性能測(cè)試
軟件開(kāi)發(fā)周期中的軟件缺陷、低劣設(shè)計(jì)和糟糕實(shí)現(xiàn)發(fā)現(xiàn)得越晚,修復(fù)的代價(jià)就越大。
自動(dòng)構(gòu)建 自動(dòng)測(cè)試 自動(dòng)性能測(cè)試(統(tǒng)計(jì)方法、自動(dòng)統(tǒng)計(jì)分析)
將性能測(cè)試集成到自動(dòng)構(gòu)建過(guò)程中后,每次代碼變更提交到源代碼庫(kù)時(shí),都能很容易地追蹤因變更而導(dǎo)致的性能變化,也就能在軟件開(kāi)發(fā)的早期發(fā)現(xiàn)性能衰減。
性能分析的兩種方法:自頂向下和自底向上
自頂向下:著眼于軟件棧頂層的應(yīng)用,從上往下尋找優(yōu)化機(jī)會(huì)和問(wèn)題。(應(yīng)用開(kāi)發(fā)人員)
自底向上:從軟件棧最底層的CPU統(tǒng)計(jì)數(shù)據(jù)開(kāi)始,逐漸上升到應(yīng)用自身的結(jié)構(gòu)或應(yīng)用常見(jiàn)的使用方式。(性能問(wèn)題專(zhuān)家)
自底向上,用以辨別因不同硬件架構(gòu)、操作系統(tǒng)或不同的Java虛擬機(jī)實(shí)現(xiàn)所導(dǎo)致的性能差異。
自頂向下
從發(fā)現(xiàn)性能問(wèn)題的負(fù)載開(kāi)始監(jiān)控應(yīng)用。
需要持續(xù)監(jiān)控應(yīng)用。
自頂向下的第一步總是對(duì)運(yùn)行在特定負(fù)載之下的應(yīng)用進(jìn)行監(jiān)控。
監(jiān)控的范圍:操作系統(tǒng)、Java虛擬機(jī)、Java EE容器、應(yīng)用的性能測(cè)量統(tǒng)計(jì)指標(biāo)。
自底向上場(chǎng)景
在不同平臺(tái)上
自底向上 監(jiān)控CPU
需要收和監(jiān)控最底層CPU的性能統(tǒng)計(jì)數(shù)據(jù)。
監(jiān)控的CPU統(tǒng)計(jì)數(shù)據(jù)包括執(zhí)行特定任務(wù)所需要的CPU指令數(shù)(路徑長(zhǎng)度),以及應(yīng)用在一定負(fù)載下運(yùn)行時(shí)的CPU高速緩存未命中率。
自底向上作用
自底向上關(guān)注的是在不更改應(yīng)用的前提下,改善CPU使用率。但也可以給修改應(yīng)用提交建議。
將經(jīng)常使用的數(shù)據(jù)放在一起,使得只要訪(fǎng)問(wèn)一條CPU高速緩存行就能獲取所有這些數(shù)據(jù),而不用從內(nèi)存獲取數(shù)據(jù)。這可以降低CPU高速緩存未命中率,從而減少CPU等待內(nèi)存數(shù)據(jù)的時(shí)間。
自底向上 操作
先從收集操作系統(tǒng)和JVM的統(tǒng)計(jì)數(shù)據(jù)開(kāi)始。據(jù)此判斷對(duì)應(yīng)用和JVM進(jìn)行性能分析是否有意義。
Java虛擬機(jī)集成了JIT編譯期
現(xiàn)代Java虛擬機(jī)集成了JIT編譯器,可以在Java應(yīng)用的執(zhí)行過(guò)程中進(jìn)行優(yōu)化。
依據(jù)應(yīng)用的內(nèi)存訪(fǎng)問(wèn)模式或應(yīng)用特定的代碼路徑,生成更有效的機(jī)器碼。
調(diào)整操作系統(tǒng)的設(shè)置來(lái)改善性能,比如更改CPU調(diào)度算法,修改操作系統(tǒng)的等待時(shí)間(操作系統(tǒng)在將應(yīng)用執(zhí)行線(xiàn)程遷移到其他CPU硬件線(xiàn)程之前所花費(fèi)的時(shí)間)
選擇正確的平臺(tái)并評(píng)估系統(tǒng)性能
CPU架構(gòu)
每核多硬件線(xiàn)程(CMT,Chip Multithreading)
隨著CPU架構(gòu)的演變發(fā)展,評(píng)估系統(tǒng)性能的方法也需要與時(shí)俱進(jìn)。
選擇正確的CPU架構(gòu)
每核多硬件線(xiàn)程:在一個(gè)時(shí)鐘周期內(nèi),每核多硬件線(xiàn)程中只有一個(gè)可以運(yùn)行,如果發(fā)生長(zhǎng)延遲,例如CPU高速緩存未命中,如果同一個(gè)核中還有其他就緒的硬件線(xiàn)程,下一個(gè)時(shí)鐘周期就會(huì)讓這個(gè)硬件線(xiàn)程運(yùn)行。
每核單硬件線(xiàn)程:如果就緒的應(yīng)用線(xiàn)程已經(jīng)準(zhǔn)備好運(yùn)行去沒(méi)有可用的硬件線(xiàn)程,運(yùn)行前就必須進(jìn)行線(xiàn)程上下文切換。
線(xiàn)程上下文切換需要耗費(fèi)數(shù)百個(gè)時(shí)鐘周期。
每核多硬件線(xiàn)程的CPU相對(duì)每核單硬件線(xiàn)程或者無(wú)法在下一個(gè)周期切換的CPU相比,運(yùn)行的時(shí)鐘頻率較低。
每核多硬件線(xiàn)程:需要大量并發(fā)的線(xiàn)程,讓大量硬件線(xiàn)程保持負(fù)荷,從而在發(fā)生例如CPU高速緩存未命中這樣的事件時(shí),發(fā)揮它在下一時(shí)鐘周期切換到另一硬件線(xiàn)程的能力。