建議將性能調優(yōu)集成到軟件開發(fā)過程中。
性能問題的現(xiàn)狀
傳統(tǒng)的軟件開發(fā)過程:分析蹦哼、設計鳄哭、編碼、測試纲熏。
分析:用于評估需求妆丘、權衡各種架構的利弊以及構思高層抽象。
設計:依據分析階段的基本架構和高層抽象局劲,進行更精細的抽象并著手考慮具體實現(xiàn)勺拣。
測試:通常只包含功能測試。
遵循傳統(tǒng)軟件開發(fā)過程的應用鱼填,通常要到測試或即將發(fā)布時才會關注性能或擴展性药有。
對于分析階段提煉出來的性能需求,建議以用例的方式特別標識出來苹丸,這有助于在分析階段制定性能評估指標愤惰。
性能測試階段:基準測試 性能測試
軟件開發(fā)周期中的軟件缺陷、低劣設計和糟糕實現(xiàn)發(fā)現(xiàn)得越晚赘理,修復的代價就越大宦言。
自動構建 自動測試 自動性能測試(統(tǒng)計方法、自動統(tǒng)計分析)
將性能測試集成到自動構建過程中后商模,每次代碼變更提交到源代碼庫時奠旺,都能很容易地追蹤因變更而導致的性能變化,也就能在軟件開發(fā)的早期發(fā)現(xiàn)性能衰減阻桅。
性能分析的兩種方法:自頂向下和自底向上
自頂向下:著眼于軟件棧頂層的應用凉倚,從上往下尋找優(yōu)化機會和問題。(應用開發(fā)人員)
自底向上:從軟件棧最底層的CPU統(tǒng)計數據開始嫂沉,逐漸上升到應用自身的結構或應用常見的使用方式稽寒。(性能問題專家)
自底向上,用以辨別因不同硬件架構趟章、操作系統(tǒng)或不同的Java虛擬機實現(xiàn)所導致的性能差異杏糙。
自頂向下
從發(fā)現(xiàn)性能問題的負載開始監(jiān)控應用。
需要持續(xù)監(jiān)控應用蚓土。
自頂向下的第一步總是對運行在特定負載之下的應用進行監(jiān)控宏侍。
監(jiān)控的范圍:操作系統(tǒng)、Java虛擬機蜀漆、Java EE容器谅河、應用的性能測量統(tǒng)計指標。
自底向上場景
在不同平臺上
自底向上 監(jiān)控CPU
需要收和監(jiān)控最底層CPU的性能統(tǒng)計數據。
監(jiān)控的CPU統(tǒng)計數據包括執(zhí)行特定任務所需要的CPU指令數(路徑長度)绷耍,以及應用在一定負載下運行時的CPU高速緩存未命中率吐限。
自底向上作用
自底向上關注的是在不更改應用的前提下,改善CPU使用率褂始。但也可以給修改應用提交建議诸典。
將經常使用的數據放在一起,使得只要訪問一條CPU高速緩存行就能獲取所有這些數據崎苗,而不用從內存獲取數據狐粱。這可以降低CPU高速緩存未命中率,從而減少CPU等待內存數據的時間胆数。
自底向上 操作
先從收集操作系統(tǒng)和JVM的統(tǒng)計數據開始肌蜻。據此判斷對應用和JVM進行性能分析是否有意義。
Java虛擬機集成了JIT編譯期
現(xiàn)代Java虛擬機集成了JIT編譯器幅慌,可以在Java應用的執(zhí)行過程中進行優(yōu)化宋欺。
依據應用的內存訪問模式或應用特定的代碼路徑,生成更有效的機器碼胰伍。
調整操作系統(tǒng)的設置來改善性能,比如更改CPU調度算法酸休,修改操作系統(tǒng)的等待時間(操作系統(tǒng)在將應用執(zhí)行線程遷移到其他CPU硬件線程之前所花費的時間)
選擇正確的平臺并評估系統(tǒng)性能
CPU架構
每核多硬件線程(CMT骂租,Chip Multithreading)
隨著CPU架構的演變發(fā)展,評估系統(tǒng)性能的方法也需要與時俱進斑司。
選擇正確的CPU架構
每核多硬件線程:在一個時鐘周期內渗饮,每核多硬件線程中只有一個可以運行,如果發(fā)生長延遲宿刮,例如CPU高速緩存未命中互站,如果同一個核中還有其他就緒的硬件線程,下一個時鐘周期就會讓這個硬件線程運行僵缺。
每核單硬件線程:如果就緒的應用線程已經準備好運行去沒有可用的硬件線程胡桃,運行前就必須進行線程上下文切換。
線程上下文切換需要耗費數百個時鐘周期磕潮。
每核多硬件線程的CPU相對每核單硬件線程或者無法在下一個周期切換的CPU相比翠胰,運行的時鐘頻率較低。
每核多硬件線程:需要大量并發(fā)的線程自脯,讓大量硬件線程保持負荷之景,從而在發(fā)生例如CPU高速緩存未命中這樣的事件時,發(fā)揮它在下一時鐘周期切換到另一硬件線程的能力膏潮。