性能調優, 你的力氣用對地方了嗎?

jopen 9年前發布 | 12K 次閱讀 性能調優

本文為<< Performance Tuning: A Comprehensive Guide >>讀書筆記. 另請參閱:


做過性能調優的同學都知道, 最怕的不是性能差, 而是費了半天勁在細節上死摳, 卻忽視了另外一整個對性能有巨大影響的維度, 旁邊放著一西瓜卻使勁在芝麻上雕花. 針對這種情況, << Performance Tuning: A Comprehensive Guide >>的作者梳理了影響性能的幾個維度, 具備一定的完整性, 新手可以按圖索驥的去調優, 老手也可以拿來參考看看是否漏掉了某些事半功倍的方法.

這里談到的性能是一種統稱, 包含響應時間/延遲latency, 吞吐量throughput等, 也暫時不涉及壓力測試負載測試等手段類似但意圖不同的測試(它們之間的聯系和區別可參考Restatement: 性能,容量,負載,以及壓力測試)

該體系將影響性能的因素分了三大類, 分別是

  • 算法本身,
  • 算法運行環境與所需資源,
  • 以及算法和環境資源的交互.

這三類基本囊括了所有因素. 下面我們來看一下里面的細節.

優化算法本身

這通常是我們一頭扎進去就開始局部優化的地方. 常用的手段包括使用各種 Profiler 來度量 CPU 時間, 內存占用率, 函數調用次數以進行問題定位, 然后實施各種調優方法, 比如優化循環, 空間換時間等.

選擇合適的數據結構自然算作此類優化, 而我們把不同存儲模型等較大規模的優化也歸為此類, 比如使用 Document 代替關系型存儲等.

這個方向的優化可以很快的幫助我們消除一些明顯的編程細節引起的瓶頸, 但過了初期突飛猛進的階段后, 每獲得一點改善, 都需要付出巨大的智力上的努力, 事半功倍. 不要忘了我們還有另外的武器.

優化運行環境與資源

運行環境與資源包括各種軟硬件平臺: 操作系統, 數據庫, 運行平臺, CPU, 內存, 磁盤, 網絡等等. 最簡單, 最省事的調優方法其實是優化硬件資源, 使用快速計算資源代替慢速計算資源, 提升資源計算能力:

  • 更快的 CPU
  • 更快的本地 IO 設備: 內存代替硬盤, SSD 代替機械硬盤, 增加內存減少分頁
  • 更快的網絡 IO 設備: 光纖及專線增加網絡帶寬, 萬兆千兆網卡代替千兆百兆網卡
  • 快速計算資源代替慢速計算資源不局限于同類資源, 比如快速存儲代替慢速存儲. 跨類型的資源優化也有很好的例子, 比如本地計算換網絡傳輸: 壓縮傳輸內容是一種常見的性能優化, 增加 CPU 壓縮解壓縮時間, 但可減少大量網絡傳輸時間.

而運行平臺的軟件部分, 比如操作系統, 數據庫, 中間件等, 調優的成本要高一些, 并且有可能工作量大到不可接受. 比如從 Windows 平臺遷移到 Linux 平臺, 從數據庫 A 切換到數據庫 B, 從 EJB 切換到 Spring… 這些最好在初期就考慮好

這類調優見效快, 但受制于預算, 及硬件本身的限制. 通常很快這類調優會在榨取最后一點計算資源后, 遇到瓶頸.

而我們通常談論的焦點, 也是當前各種調優實踐最集中的領域, 是優化算法和資源間的交互, 包括:

  • 減少單臺服務器(或單位計算資源)的處理量
  • 充分利用系統資源
  • 減少不必要的計算
  • 減少不必要的IO

優化算法和資源間的交互

減少單臺服務器(或單位計算資源)的處理量

調優一般發生在單臺機器處理能力已達上限的情況. 一個思路就是把壓力分散到多臺機器上, 從而使每臺機器都能獲得可接受的延遲或吞吐量.

總的原則是分而治之. 分的維度包括業務, 組件邊界, 訪問頻率或對系統資源的消耗程度, 瓶頸資源等

  • 業務: 把大應用按業務分成獨立的互相合作的系統, 高層一點的SOA, 內層一點的數據庫分庫
  • 組件邊界: web 服務器, 應用服務器, 數據庫服務器, 文件服務器…
  • 對系統資源的消耗程度: 讀寫分離
  • 瓶頸資源: 分表分片

一旦按上述維度分好了, 還可以在所有維度上應用負載均衡, 把訪問量分散到不同服務器.

充分利用系統資源

  • 多線程: 只要原先阻塞的延遲超過了線程切換的延遲, 多線程就是值得的.
  • 多進程
  • 異步操作: 異步操作可以降低阻塞, 減少延遲, 代價是編程模型的復雜
  • 負載均衡: 在”減少單臺服務器(或單位計算資源)的處理量”和”充分利用系統資源”都提到了負載均衡, 由此可以看出負載均衡有兩個作用, 防止某臺服務器過滿, 防止某臺服務器過閑. 這真是個 useless 的結論啊, 負載均衡按定義不就是干這個的嗎?

減少不必要的計算次數

  • 緩存計算結果, 主要指服務端緩存

減少不必要的 IO 次數

  • 網絡 IO 次數: 客戶端緩存, CDN 緩存. 合并資源以減少請求次數.
  • 磁盤 IO 次數: 緩存常用數據

可以看出緩存是減少不必要計算和 IO 的重要手段. 緩存的設計主要是根據資源變化頻率對資源進行分類, 比如動靜分離等. 其前提是恰當的狀態管理, 分離無狀態的邏輯和有狀態的邏輯, 并付出一定的對一致性的妥協, 運維的復雜為代價.

緩存的適用場景:

  • 熱點不均衡
  • 有效時間不過短
  • 一致性犧牲程度可接受

以上所有手段可以組合使用, 有沖突時再做權衡.

另請參閱:

來自:http://liguanglei.name/blogs/2015/02/09/performance-tuning-a-comprehensive-guide/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!