http://www.cnblogs.com/LBSer/p/4417283.html
1 背景
隨着業務的快速成長,日訪問量越來越高,除了對功能要求很高以外,對性能要求也越來越高。 在實際工作中,我們往往會被一些問題所困擾。
1)線上服務容量是多少?性能痛點在哪里? 可伸縮性(resilience)和可靠性(reliability)怎樣?預先知道了系統的容量,做到心中有數,才能為最終規划整個運行環境的配置提供有利的依據。
2)新開發的功能是否滿足性能指標? 重新修改的代碼會不會帶來性能問題? 對服務或工具的參數修改是否有效果(如jvm參數,mysql或solr配置等)? 如果在上線用前就能進行驗證,那么不僅能極大降低部署時發生意外的概率,還能為性能優化提供指導。
2 現狀
為嘗試解決上述問題,我們在多個項目上進行過性能測試,使用過的方法主要分成三類。
方案 | 具體方式 | 優點 | 缺點 | |
人為模擬請求 | 自己寫代碼或者使用簡單的工具如httpload等去模擬用戶請求進行測試 | 操作簡單,能快速的得到cpu、mem、 load、 qps等極限值。 | 缺少真實用戶交互行為,缺乏真實性 | |
copy線上流量 | 使用tcpcopy工具實時copy線上流量到某台機器 | 操作簡單,是真實線上請求,且對線上服務壓力無影響 | 需要准備一套跟線上機器配置、依賴一致的獨立環境,同時如果是服用線上的環境的話,一些寫操作的請求被copy會有問題 | |
線上流量切換 | 直接用線上的機器和環境,通過調整nginx配置參數,逐漸將要做壓測的機器的權重增加,然后觀察該機器各個指標性能 | 真實生產線流量,能把用戶行為導向壓測服務器,是最為真實的用戶行為,能夠把一些需要登陸,有用戶交互行為的性能真實的反映出來 | 因為是用生產系統真實流量來模擬壓測,無法得出最大值,如果閥值設置有誤,也存在一定的風險。此外該性能測試也不能經常進行 |
3 存在的不足
盡管我們在性能測試上做過一些嘗試,但還遠遠不夠,存在以下不足。
3.1 性能測試指標和標准尚未完全確立
不同服務測試指標應該不同,相應的標准也不同,例如接入層服務和后端服務指標是不同的。如果我們能為各個服務制定類似如下的標准,以后再進行性能測試就有了參考依據。 隨着服務的發展,這些標准也會隨之相應改動,要求會越來越嚴格。
判斷指標 |
不通過的標准 |
超時概率 |
大於萬分之一 |
錯誤概率 |
大於萬分之一 |
平均響應時間 |
超過100ms |
0.99響應時間 |
超過200ms |
qpm(每分鍾處理的請求量) |
小於2w |
qpm波動范圍(標准差) |
正負3 |
cpu使用率 |
平均每核超過75% |
負載(load) |
平均每核超過1.5 |
jvm內存使用率 |
大於80% |
gc平均時間 |
超過1s |
fullgc頻率 |
頻率高於半小時一次 |
... |
...
|
3.2 性能測試不夠全面
圖1 淘寶性能測試曲線(a點:性能期望值;b點:高於期望,系統資源處於臨界點;c點:高於期望,拐點;d點:超過負載,系統崩潰)
根據上述壓力變化模型,淘寶網將性能測試分成狹義的4種類型:
a)性能測試:a點到b點之間的系統性能
定義:狹義的性能測試,是指以性能預期目標為前提,對系統不斷施加壓力,驗證系統在資源可接受范圍內,是否能達到性能預期。
b)負載測試 :b點的系統性能
定義:狹義的負載測試,是指對系統不斷地增加壓力或增加一定壓力下的持續時間,直到系統的某項或多項性能指標達到極限,例如某種資源已經達到飽和狀態等。
c)壓力測試:b點到d點之間
定義:狹義的壓力測試,是指超過安全負載的情況下,對系統不斷施加壓力,是通過確定一個系統的瓶頸或不能接收用戶請求的性能點,來獲得系統能提供的最大服務級別的測試
d)穩定性測試:a點到b點之間
定義:狹義的穩定性測試,是指被測試系統在特定硬件、軟件、網絡環境條件下,給系統加載一定業務壓力,使系統運行一段較長時間,以此檢測系統是否穩定,一般穩定性測試時間為n*12小時
我們現在的性能測試還沒有那么全面,比如沒有進行長時間的穩定性測試,長時間的測試執行可導致程序發生由於內存泄露引起的失敗,揭示程序中的隱含的問題或沖突。
3.3 性能測試手段缺乏
線上流量切換方法不能經常執行,copy線上流量目前只能將所有(包括讀和寫)流量拷貝過來,而自己寫程序模擬用戶請求又缺乏真實性。一種思路是自己實現測試程序將前一天的請求重新跑一遍,其核心在於控制請求頻率,使其與之前請求頻率曲線一致,從而達到近似模擬的目的。
3.4. 缺少性能測試自動化工具或平台
例如百度有個性能測試平台,有此平台后,可以方便地進行性能測試。其可以用於指導程序開發,使得在開發過程不僅關注功能,也關注性能,此外,性能測試納入持續集成,每天出報表,每天都能知道自己服務的處理能力。