高效性能調優的最佳實踐
只有采用有效的性能調優手段,才能使得性能調優達到事倍功半的效果。近日,個人博客Liguanglei中發布了一篇關于有效性能調優建議的文章,該篇文章是作者閱讀《性能調優:綜合指南》的讀書筆記。作者從影響系統性能的算法、算法運行環境與所需資源以及算法和環境資源的交互等因素講述了性能調優的一些建議。新手能夠直接根據這些建議進行系統調優,老手也可以拿來當作調優的參考。現對這些建議進行一個全面的梳理,以供讀者參考和學習,具體內容如下:
1. 算法本身的優化
算法優化是性能局部優化的首選, 并常采用各種性能監控軟件來度量CPU時間、內存占用率、函數調用次數以問題定位,然后實施各種調優方法,如優化循環、利用空間換時間、采用合適的數據結構等。但是算法本身的優化只能夠幫助大家消除一些明顯的編程細節引起的瓶頸,尤其單單通過算法優化的手段還不能完全解決性能問題,且具有非常大的難度。
2. 優化運行環境與資源
運行環境與資源包括各種軟硬件平臺,硬件環境包括CPU、內存、磁盤以及網絡等。最簡單且最省事的調優方法是優化硬件資源,使用快速計算資源代替慢速計算資源,提升資源的計算能力。
優化硬件資源的方式包括:
- 更快的CPU
- 更快的本地IO設備,比如內存代替硬盤, SSD 代替機械硬盤
- 加內存減少分頁
- 快的網絡IO設備,比如使用光纖及專線增加網絡帶寬,使用萬兆千兆網卡代替千兆百兆網卡
- 快速計算資源代替慢速計算資源,比如快速存儲代替慢速存儲(屬于同類型資源);本地計算換網絡傳輸的優化最好采用壓縮傳輸內容的優化手段(屬于不同類型的資源),該方式盡管增加了CPU的壓縮/解壓時間,但減少了大量網絡傳輸時間
</ul> </blockquote>軟件環境包括操作系統、數據庫、中間件等。軟件環境調優的成本要相對較高, 并且工作量很大,如從Windows平臺遷移到Linux 平臺、從數據庫A切換到數據庫 B、從EJB 切換到 Spring等。這類調優見效快,但受制于預算和硬件本身的限制。由于資源始終是有限的,隨著資源的消耗,仍然存在性能瓶頸。
3. 優化算法和資源間的交互
當前各種調優實踐最集中的領域是優化算法和資源間的交互,如減少單臺服務器(或單位計算資源)的處理量、充分利用系統資源、減少不必要的計算、減少不必要的IO等。
具體內容如下:
- 減少單臺服務器(或單位計算資源)的處理量
當在單臺機器處理能力已達上限的情況,就需要把壓力分散到多臺機器上, 從而使每臺機器都能獲得可接受的延遲或吞吐量。總的優化原則是分而治之,具體維度包括業務、組件邊界、訪問頻率或對系統資源的消耗程度、瓶頸資源等。
具體內容如下:
業務:把大應用按業務分成獨立的互相合作的系統,如高層的采用SOA方式,低層的采用數據庫分庫方式
組件邊界: Web服務器、應用服務器、數據庫服務器、文件服務器
對系統資源的消耗程度:采用讀寫分離的方式
瓶頸資源: 對數據庫進行分表、分片
</li> </ul> </blockquote>一旦按上述維度處理好了,大家還可以在所有維度上應用負載均衡,把訪問量分散到不同服務器。
- 充分利用系統資源
采用多進程、多線程、異步操作以及負載均衡等手段,其中負載均衡主要做到了防止某臺服務器過滿和防止某臺服務器過閑。
- 減少不必要的計算次數
緩存計算結果,尤其是服務端緩存,以減少不必要的計算。
- 減少不必要的 IO 次數
網絡IO次數:客戶端緩存、CDN緩存、合并資源以減少請求次數
磁盤IO次數:緩存常用數據,如利用Redis、Memcached進行緩存
</li> </ul> </blockquote>最后,作者總結指出緩存是減少不必要計算和IO的重要手段,緩存的設計主要是根據資源變化頻率對資源進行分類,比如動靜分離等;其前提是恰當的狀態管理、分離無狀態的邏輯和有狀態的邏輯,但會付出對一致性的一定妥協和運維的復雜為代價。緩存的適用場景包括熱點不均衡、有效時間不太短、一致性犧牲程度可接受。作者還指出以上所有優化手段可以組合使用,有沖突時再做權衡。
作者還推薦了一些參閱文章:有關壓力測試、負載測試的《重述:性能、容量、負載以及壓力測試》和《性能調優技術的幾個角度》。此外,有興趣的讀者還可以參閱酷殼陳皓發表的一篇題為《性能調優攻略》的文章。
來自:http://www.infoq.com/cn/news/2015/02/performance-tuning-suggestions