背景
大部分者開發者入行都是功能實作角度入行,大部分測試人員也是相似的經曆。一般項目都是最後時間跟性能較勁,由于系統的複雜性和變更的成本等導緻性能工作多數是草草收尾。有沒有更好的工程實踐呢?
有!
感謝剛入行的幾年的開發工作經曆,養成了面向性能、面向穩定性、面向功能的持續開發實踐的習慣。現在這裡分享給大家!
定義
本文所談的開發包括需求、設計、實作、測試,即廣義的開發。
面向性能的需求分析
離開業務需求談高性能容易陷入為技術而技術的陷阱。抛開資源、成本談高性能則容易導緻不必要的項目投入。
正常産品、系統除了功能需求外,都會伴随着性能需求。隻是因其隐蔽性,導緻不是所有的需求提出者都能想到或能給出準确的性能需求。此時就需要系統架構師幫助客戶梳理和制定合理的性能需求。性能需求至少包括以下幾個角度的資訊:
- 什麼場景?
- 什麼資料量下?
- 多大的業務并發情況下?
- 多大的計算、網絡的資源基礎上?
- 怎麼定義一個性能評估模型?如 TPCC。
面向性能的架構設計
所有架構都有其基礎的性能損耗,一方面是性能得以實作的基礎,另一方面也是性能上限的瓶頸。
- 比如引入了緩存就可能比不用緩存的要高性能,但同時引入了資料一緻性問題,增加了系統的複雜度和脆弱性;
- 比如引入的異步處理,增加了回報的及時性,同時導緻原本一次性的操作被分解為多個操作的協同;
- 比如引入了微服務架構,擷取了水準擴充能力,但因增加了服務間調用增加系統性能的損耗。
要逐漸積累一些基本基本元件的性能資料。
- 如廣域網的通訊時間幾十毫秒很常見;
- 比如資料庫的讀取和寫入是有很大的不同;
- 比如很多系統都有隐式的緩存,如資料庫、檔案系統。
要知道架構設計的重點之一是平衡各種需求
- 功能需求
- 性能需求
- 容量需求
- 穩定性需求
- 可維護性需求
要将系統的性能需求拆解為子系統、子子產品的性能需求,比如整體對外需要 1 秒完成資料處理,有代理、計算、存儲 3 個環節,則留給計算環節的平均耗時為多少?
面向性能的系統實作
在很多情況下,系統實作和系統設計是彼此交錯的兩類工作。在将系統架構落實為系統實作時,要從多個層次來實作系統。一些好的開發實踐包括:
- 在開發過程中,除了設計面向功能測試的單元測試外,還要開發面向性能的測試架構;
- 建構符合性能測試需求的基礎資料;
- 随着代碼的推進,周期性運作性能測試架構,持續跟蹤性能劣化的趨勢,将其控制在需求範圍内;
- 同樣的功能有 N 種實作方式,但性能千差萬别,甚至 do while 和 for 都要反複權衡寫法。
性能測試與性能優化
性能測試本質上是性能摸底,性能測試不能改變系統的性能,但有助于對系統性能名額、性能瓶頸達成共識。
性能測試的設計考驗的是技術人員的綜合能力。
性能測試的執行考驗的是技術人員的耐心和細心。
性能測試的度量有時會幹擾被測對象的性能,如寫日志、輸出到螢幕、測試資料的累計都可能拉低系統的性能。
性能優化的推進需要有系統的視野,不要過早陷入局部優化的泥潭,至少要做好 2 個準備,以形成改進的閉環:
- 系統分段度量的能力
- 系統改進度量的能力
性能神話
- 期望在測試階段能優化性能
木已成舟,架構是性能優化的天花闆,代碼是性能優化的限制。
- 期望性能開發的銀彈
從項目角度看,加緩存不一定成本效益高;一個系統上的性能開發經驗不一定能遷移到另一個系統上,注意場景、資源等的差異。
雲頂雲(yundingyun.com)是國内首批專注于雲計算服務的提供商,緻力于“讓雲計算更簡單”。做為阿裡雲五星授權服務中心,雲頂雲緻力于為企業和政府提供方案咨詢、架構設計、部署實施、系統定制、運維托管、技術教育訓練等全方位“4S”級公有雲、私有雲定制化服務。