如何進行測試?
我經常遇到一些開發團隊,他們收到諸如“客戶端將每小時處理20個客戶”此類的性能需求。團隊就試圖把該需求轉化為某種測試。執行這種測試的常見方法就是以死循環的形式對服務器進行反復請求,然后靜觀其效。通常事情進行得不是很順利,這就是為什么隨后我會作為一個性能專業化方面的顧問“遇見他們”的原因。通常我問的第一個問題是:“您是如何進行測試的?”一般來說,答案會是:“我們將請求置于循環中,然后計算服務器可以處理的請求的數目!闭沁@種回答使我明白首先要做的就是調整測試工具本身。
如果您不明白上述測試有什么問題,不要擔心——有很多人和您一樣。進行一次切實可行的壓力測試并不像乍看之下那么簡單。遇到的問題可能非常微妙,而且通常只有采用不那么簡單的方法來理清情況才能看清問題。但是這并不是讓您目光呆滯地深入研究馬爾可夫鏈(Markov chains)、狀態改變模型、排隊理論、概率分布等等,讓我們以一種不那么乏味的、更通俗易懂的方式來說明如何解決這個在許多壓力測試中出現的常見問題。
測試方式將影響測試
我們首先要明白的是,雖然測試通常都是從客戶端活動的角度定義的,但是它們必須從以服務器為中心的視角來看待。以服務器為視角將只看到客戶端訪問的頻率和處理每個請求所花費的時間。讓我們考慮一個典型例子,即銀行的出納員。出納員通常不知道您是什么時候到的,也不知道您是從哪里來的。他們所知道的只是您在這里,而且您要讓他們為您做一些事情,F在,隊列中有多少人將取決于人們到達的速度,以及滿足他們的要求所花的時間。
比隊列中有多少人更重要的是,隨著后來的人不斷補進隊列,房間中的人數是在減少、保持不變還是在增加?與之相隨的另一個問題是,人們進入隊列的速度與離開的速度相比,是快一些、相同還是慢一些?如果離開的速度要比到達的速度快,那么處理請求的速度要比遞交請求的速度快。第二種情況說明剛剛處理完一個客戶,下一個就到達了。最后一種情況則說明人們到達的速度要比處理的速度快。用數學術語來說,第一種系統是收斂的,第二種處于穩定狀態,第三種則是發散的。這三種情況中房間中的人數都是由利托氏定理(Little's Law)決定的。
只做力所能及的
對于外行來說,利托氏定理說明了您只能做這么多工作。其數學版本是這么說的:系統中的請求數等于請求到達的速度乘以它們在系統中的時間所產生的積。如果它們在系統中的時間取決于流出系統的速度(通常稱為服務時間),那么就可以通過觀察請求到達的頻率(請求到達間隔時間)并與服務時間比較,而確定系統處于哪種狀態。
對于每種情況,利托氏定理都描述了系統是如何處理工作負載的。雖然狀態可能會發生瞬時的迸發和間歇,總體的趨勢還將由平均的狀況決定。例如,在收斂系統中,可能會由于許多人同時進入隊列而產生瞬時的暴漲,但是隊列仍將會騰空,因為收斂系統的傾向就是趨向空閑。但是,第三種場景是發散的,其中的請求數將會無限增長。它會嗎?這個問題的答案與如何定義發出請求的全域有關。
在某個隨機的時間點,全域中的用戶將發出一個請求。這肯定是從以服務器為中心的視角來看全域了。大多數系統都基于一個假設,即在任一個給定的時間點,全域中只有一部分會發出請求。經驗告訴我們,在許多因特網應用程序中,全域中有10%在任意時間點都是活動的。我們需要知道這種信息,如果我們要定義實際的壓力測試的話。例如,如果全域中有1000個用戶,我們會預料有100個每時每刻都在使用系統。由于我們估計會有10%的并發使用,用戶庫又有1000個用戶,所有我們的測試應該模擬100個用戶重復執行一些請求系列。用這種方法定義測試的危害是它反映的是客戶端的視角。
文章來源于領測軟件測試網 http://www.kjueaiud.com/