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