基準測試是針對系統設計的一種壓力測試。通常的目標是為了掌握系統的行為。重新某個系統狀態,或者是做新硬件的可靠性測試。
2.1 為什么需要基準測試
基準測試是唯一方便有效的、可以學習系統在給定的工作負載下會發生什么的方法。可以觀察系統在不同壓力下的行為,評估系統的容量,掌握哪些是重要的變化,或者觀察系統如何處理不同的數據。
1.驗證基于系統的一些假設,確認這些假設是否符合實際情況。
2.重現系統中的某些異常行為,以解決這些異常。
3.測試系統當前的運行情況。如果不清楚系統當前的性能,就無法確認某些優化的效果如何。
4.模擬比當前系統更高的負載,以找出系統隨著壓力增加而可能遇到的拓展性平靜下來。
5.規劃未來的業務增長。基準測試可以評估在項目未來的負載下,需要什么樣的硬件,多大容量的網絡,以及其他相關資源。
6.測試應用適應可變環境的能力。也可測試系統對數據分布的處理能力。
7.測試不同的硬件、軟件和操作系統配置。
8.證明新采購的設備是否配置正確。
基準測試的一個主要問題在于其不是真實壓力的測試。基準測試的壓力會受到比如數據量、數據和查詢的分布等因素影響。但最重要的一點還是基準測試通常要求盡可能快的執行完畢,所以經常給系統造成過大的壓力。
2.2 基準測試的策略
基準測試有兩種主要的策略:一種是針對整個系統的整體測試,另外是單獨測試MySQL。兩種測試也被稱為集成式以及單組件式集成測試。
針對整個系統做集成式測試,而不是單獨測試MySQL的原因有以下幾點:
? 測試整個應用系統,包括Web服務器、應用代碼、網絡和數據庫是否非常有用的,因為用戶關注的并不僅僅是MySQL本身的性能,而是應用整體的性能。
? MySQL并非總是應用的瓶頸,通過整體測試可以揭露這一點。
? 只有對應用做整體測試,才能發現各個部分之間的緩存帶來的影響。
? 整體應用的集成式測試更能揭示應用的真實表現,而單獨組建的測試很難做到這一點。
但是,應用的整體基準測試很難建立,而且很難正確設置。
不過,有時候不需要了解整個應用的情況,而只需要關注MySQL的性能。基于以下情況,可以只選擇測試MySQL:
? 需要比較不同的schema或者查詢性能。
? 針對應用中的某個問題的測試。
? 為了避免漫長的基準測試,可以通過一個短期的基準測試,做快速的“周期循環”,來檢測出某些調整后的效果。
2.1.1 測試何種指標
在開始執行甚至在設計基準測試之前,需要先明確測試的目標。不同的方法測試不同的指標。
吞吐量
吞吐量指的是單位時間內的事務處理數。
響應時間或者延遲
指的是測試任務所需的整體時間。測試的時間單位可能是微妙、毫秒、秒或者分鐘。根據不同的時間單位可以計算出響應時間、最小響應時間、最大響應時間和所占百分比。使用圖表有助于理解測試結果。
并發性
并發行并非同時訪問統一站點用戶的數量,而關注的是工作中的并發操作,或者是同時工作中的線程數或者連接數。
可拓展性
簡單的說,可拓展性指的是,給系統增加一倍多工作,在理想情況下就能獲得兩倍的結果。或者說給系統增加一倍的資源,就可以獲得兩倍的吞吐量。
2.3 基準測試方法
在基準測試之前,先來看一下如何避免一些常見的錯誤,這些錯誤可能會導致測試結果無用或者不準確:
? 使用真是數據的子集而不是全集。
? 使用錯誤的數據分布。
? 使用不真實的分布參數。
? 再多用戶場景下,只做單用戶的測試。
? 在單服務器上測試分布式應用。
? 與真實用戶行為不匹配。
? 反復執行同一個查詢。
? 沒有檢查錯誤。基準測試完成后,一定要檢查一下錯誤日志,這應當是基本的要求。
? 忽略了系統預熱的過程。
? 使用默認的服務器配置。
? 測試時間太短。
2.3.1 設計和規劃基準測試
規劃基準測試的第一步是提出問題并明確目標。然后決定采用標準的基準測試,還是選擇專用的測試。
如果采用標準的基準測試,應該確定選擇了合適的測試方案。
2.3.2 基準測試應該運行多久時間
基準測試應該運行足夠長的時間,這一點很重要,如果需要測試系統在穩定狀態時的性能,那么當然需要在穩定狀態下的測試并觀。大部分系統都會有一些應對突發情況的余量能夠吸收性能尖峰,將一些工作延遲到高峰期之后執行。但當對機器加壓足夠長時間之后,這些余量會被耗盡,系統的短期尖峰也就無法維持原來的高性能。如果無法確認測試需要多長時間才足夠,那就可以讓測試一直執行。
2.3.3 獲得系統性能和狀態