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