雲計算

淺談面向性能的開發

背景

大部分者開發者入行都是功能實現角度入行,大部分測試人員也是相似的經歷。一般項目都是最後時間跟性能較勁,由於系統的複雜性和變更的成本等導致性能工作多數是草草收尾。有沒有更好的工程實踐呢?
有!
感謝剛入行的幾年的開發工作經歷,養成了面向性能、面向穩定性、面向功能的持續開發實踐的習慣。現在這裡分享給大家!

定義

本文所談的開發包括需求、設計、實現、測試,即廣義的開發。

面向性能的需求分析

離開業務需求談高性能容易陷入為技術而技術的陷阱。拋開資源、成本談高性能則容易導致不必要的項目投入。
常規產品、系統除了功能需求外,都會伴隨著性能需求。只是因其隱蔽性,導致不是所有的需求提出者都能想到或能給出準確的性能需求。此時就需要系統架構師幫助客戶梳理和制定合理的性能需求。性能需求至少包括以下幾個角度的信息:

  • 什麼場景?
  • 什麼數據量下?
  • 多大的業務併發情況下?
  • 多大的計算、網絡的資源基礎上?
  • 怎麼定義一個性能評估模型?如 TPCC。

面向性能的架構設計

所有架構都有其基礎的性能損耗,一方面是性能得以實現的基礎,另一方面也是性能上限的瓶頸。

  • 比如引入了緩存就可能比不用緩存的要高性能,但同時引入了數據一致性問題,增加了系統的複雜度和脆弱性;
  • 比如引入的異步處理,增加了反饋的及時性,同時導致原本一次性的操作被分解為多個操作的協同;
  • 比如引入了微服務架構,獲取了水平擴展能力,但因增加了服務間調用增加系統性能的損耗。

要逐漸積累一些基本基本組件的性能數據。

  • 如廣域網的通訊時間幾十毫秒很常見;
  • 比如數據庫的讀取和寫入是有很大的不同;
  • 比如很多系統都有隱式的緩存,如數據庫、文件系統。

要知道架構設計的重點之一是平衡各種需求

  • 功能需求
  • 性能需求
  • 容量需求
  • 穩定性需求
  • 可維護性需求

要將系統的性能需求拆解為子系統、子模塊的性能需求,比如整體對外需要 1 秒完成數據處理,有代理、計算、存儲 3 個環節,則留給計算環節的平均耗時為多少?

面向性能的系統實現

在很多情況下,系統實現和系統設計是彼此交錯的兩類工作。在將系統架構落實為系統實現時,要從多個層次來實現系統。一些好的開發實踐包括:

  • 在開發過程中,除了設計面向功能測試的單元測試外,還要開發面向性能的測試框架;
  • 構建符合性能測試需求的基礎數據;
  • 隨著代碼的推進,週期性運行性能測試框架,持續跟蹤性能劣化的趨勢,將其控制在需求範圍內;
  • 同樣的功能有 N 種實現方式,但性能千差萬別,甚至 do while 和 for 都要反覆權衡寫法。

性能測試與性能優化

性能測試本質上是性能摸底,性能測試不能改變系統的性能,但有助於對系統性能指標、性能瓶頸達成共識。
性能測試的設計考驗的是技術人員的綜合能力。
性能測試的執行考驗的是技術人員的耐心和細心。
性能測試的度量有時會干擾被測對象的性能,如寫日誌、輸出到屏幕、測試數據的累計都可能拉低系統的性能。
性能優化的推進需要有系統的視野,不要過早陷入局部優化的泥潭,至少要做好 2 個準備,以形成改進的閉環:

  • 系統分段度量的能力
  • 系統改進度量的能力

性能神話

  • 期望在測試階段能優化性能

木已成舟,架構是性能優化的天花板,代碼是性能優化的約束。

  • 期望性能開發的銀彈

從項目角度看,加緩存不一定性價比高;一個系統上的性能開發經驗不一定能遷移到另一個系統上,注意場景、資源等的差異。

雲頂雲(yundingyun.com)是國內首批專注於雲計算服務的提供商,致力於“讓雲計算更簡單”。做為阿里雲五星授權服務中心,雲頂雲致力於為企業和政府提供方案諮詢、架構設計、部署實施、系統定製、運維託管、技術培訓等全方位“4S”級公有云、私有云定製化服務。

Leave a Reply

Your email address will not be published. Required fields are marked *