性能工程之性能規劃實踐
隨著軟件系統的規模越來越龐大,對性能的需求越來越高,性能測試的要求也越來越高。但是僅僅做性能測試,已經很難滿足當前軟件系統對于性能的各種需求,所以需要做更多性能相關的工作。而對于這一系列性能相關的工作,我們稱之為性能工程。
性能工程是發現和解決軟件系統性能問題最主要的方法體系和技術手段,它一般包含以下幾個部分:性能測試,性能輪廓,性能分析,性能優化和性能規劃(容量規劃)。
- 性能測試:通過不同類型的測試,獲取系統在不同情況下的性能情況,包括各種外部性能指標,是否滿足實際的性能需求等。
- 性能輪廓:通過特定的工具獲取被測系統的各種內部性能指標,從而輔助性能分析工作。
- 性能分析:通過分析性能測試和性能輪廓獲得的各種數據等,發現性能瓶頸以及其原因,從而輔助性能優化的工作。
- 性能優化:通過各種技術和業務手段,盡可能消除性能瓶頸,從而提升系統的性能。
- 性能規劃:通過在不同配置下,進行不同規模的性能測試,獲取系統的性能變化規律。并針對不同的性能需求,利用這個規律對服務器資源和容量進行規劃,從而滿足不同的性能需求。
在性能工程中,技術層面上最難的部分是性能分析和性能優化,而整體上最為繁瑣和復雜的則是性能規劃,因為其包括了性能測試,基礎設施,性能建模和資源協調等相關的工作,甚至需要做系統架構調整才能滿足相應的規劃工作。
性能規劃
對于用戶量不大的中小型系統,因為單機或者少量的多機就可以滿足所有的業務性能需求,所以一般不需要做性能規劃。但是隨著業務性能需求的增大,產品環境的資源需求隨之增加。但是為了避免增加過多資源,盡可能地減少資源的浪費,所以需要找到滿足業務性能需求的最小資源量。
通過性能規劃,可以找到這個最小的資源量。其次,有些項目的產品環境和測試環境的資源是不一樣的,甚至有巨大的區別。使用性能規劃的一系列實踐,可以通過測試環境的性能指標,推測或者計算出產品環境中大概的性能情況。從而判斷當前的產品環境是不是滿足業務性能需求。
傳統
現代彈性云平臺出現之前,如果要部署一個服務器系統,必須購買固定配置和數量的物理機,應用服務器多機擴展也相對很困難,成本也很高。傳統的數據庫系統則更難以進行擴展,雖然以NewSQL為代表TiDB等數據庫已經支持了水平橫向擴展的能力,但是和應用服務器一樣,硬件水平橫向擴張也相對很困難,成本也很高。所以在傳統的基礎設施上做性能規劃的痛點比較多,難度也比較大。
現代
現代彈性云平臺出現之后,在其上的服務實例的硬件配置和數量可以非常容易地變更,數據庫的硬件能力也可以進行變更。所以在這種基礎設施下,可以更為容易地進行性能規劃的工作。
實踐
在進行性能規劃之前,一定要熟悉整個系統的架構,并針對三個關鍵點進行隔離分析:網關,應用服務器和數據庫。
以現在的技術,很難對已有的網關系統本身進行水平橫向擴展,只能對其進行單機擴展,包括升級CPU,內存等。對于應用服務器,單機配置最好要和產品環境的實例保持一致,只是改變服務器數量來進行性能規劃測試。對于無法進行水平橫向擴展的應用系統來說,一般不需要做性能規劃。最后對于數據庫,如果無法水平擴展的數據庫系統,可以使用云平臺自帶的數據庫系統,因為現在大部分云數據庫系統都支持擴展數據庫的單機能力,比如Amazon RDS和 Azure SQL Database等。如果使用的是分布式數據庫,則可以像應用服務系統一樣在云平臺上進行水平橫向擴展。
只有根據業務性能需求,對關鍵三點都盡可能分別做性能規劃,才能做到真正的全方位的性能規劃。
步驟:
做性能規劃,一般有以下6個基本步驟:
- 準備測試環境
- 選取測試指標
- 建立測試模型
- 變化測試指標并進行性能測試
- 分析測試報告、擬合測試數據
- 找到性能變化規律,并規劃產品環境性能
首先準備測試環境,最好選用云平臺作為測試環境,如果無法使用云平臺則需要準備足夠量的物理機,以便得到足夠的擬合數據。選取性能指標和建立測試模型是最關鍵和重要的兩步,它們的正確和有效性直接影響到性能規劃的工作量和結果的有效性。對于業務需求和系統架構的不同,重點關注的指標也有所不同,比如數據密集型的系統,一般會選取Response Time和TPS等作為關鍵指標;而數據存儲型的系統,則選擇吞吐量和IO作為關鍵指標。對于測試模型則可以考慮基于獨立功能或者是基于場景,是需要有Think Time還是不需要,下圖就是一個簡單的測試模型的示例:
變化測試指標并進行性能測試則是最繁瑣的步驟,因為需要改變各種配置和指標來進行測試,并收集各種測試結果數據。最后兩步則是通過分析和數學擬合,并根據業務性能需求產出性能規劃結果。
最后為了驗證性能規劃的有效性,需要在產品環境中通過各種監控手段,比如應用系統埋點采集或者日志采集,服務器探針等獲取應用系統和服務器的各種性能數據,從而驗證性能規劃的有效性。
擬合
在性能規劃的步驟里面有一步是擬合測試數據,它是通過數學的擬合方法,通過測試數據打點之后,得到一個曲線和與之相應的數學函數,然后通過這個數學函數可以估計性能的變化規律,從而對于硬件資源和系統配置進行規劃的工作。
下表是一個以實例數量作為變化指標,在特定時間內完成的請求數作為觀察指標的測試結果數據:
然后通過這些數據生成散列圖(以下演示圖使用的是MS Excel生成的,可以使用任何其他的數學工具或者庫來生成以下的演示圖,比如SageMath,Mathematica等)
擬合有很多種方式,比如指數擬合,線性擬合和多項式擬合等。一般情況下,多項式擬合可以獲得比較準確的結果,下面三張圖是通過Excel生成的多項式擬合(包括方程)。其中R=1則表示多項式完全符合所有的坐標點,且斜率為正。但是測試結果數據本身就存在一些不確定性,所以一般會找盡可能R接近1并且曲線盡可能平滑的擬合結果來進行推算。比如下圖中我就會選擇第一張圖中的擬合函數來進行推算。
擬合圖1:
擬合圖2:
擬合圖3:
一般情況下,做性能規劃測試時,還可以選取下圖中的指標來進行測試,并得到相應的數據來做二維擬合:
除了二維擬合,還可以做三維擬合,下圖是常規情況下做三維擬合需要關注和變化的指標:
總結
性能規劃在大型應用服務系統中的地位越來越高,因為它可以發現系統在常規性能測試的情況下很難發現的一些性能瓶頸問題,找到性能規律,從而根據不同的業務性能需求來規劃產品環境的資源和配置,從而可以有效地防止服務器過載或者節約產品環境的資源和成本,一舉多得。