大概在一年前的一次討論中,我的好友陳華第一次提到了這個模型的最初版本,經(jīng)過幾次討論后,我們發(fā)現(xiàn)經(jīng)過完善和擴展的“理發(fā)店模型”可以用來幫助我們理解很多性能測試的概念和理論,以及一些測試中遇到的問題。在最近的一次討論后,我決定撰寫一篇文章來專門講述一下這個模型,希望可以幫助大家更好的理解性能測試有關(guān)的知識。
不過,在這篇文章中,我將會盡量的只描述模型本身以及相關(guān)的一些擴展,而具體如何將這個模型完全同性能測試關(guān)聯(lián)起來,我不會全部說破,留下足夠的空間讓大家繼續(xù)思考和總結(jié),最好也一起來對這個模型做進(jìn)一步的完善和擴展^_^ 我相信,當(dāng)大家在思考的過程中有所收獲并有所突破時,那種快感和收獲的喜悅才真的是讓人倍感振奮而且終生難忘的 ^_^
當(dāng)然,我要說明的是,這個模型僅僅是1個模型,它與大家實際工作中遇到的各式各樣的情況未必都可以一一對應(yīng),但是大的方向和趨勢應(yīng)該是一致的。
相信大家都進(jìn)過或見過理發(fā)店,一間或大或小的鋪面,1個或幾個理發(fā)師,幾張理發(fā)用的椅子和供顧客等待的長條板凳。

在我們的這個理發(fā)店中,我們事先做了如下的假設(shè):
1. 理發(fā)店共有3名理發(fā)師;
2. 每位理發(fā)師剪一個發(fā)的時間都是1小時;
3. 我們顧客們都是很有時間觀念的人而且非常挑剔,他們對于每次光顧理發(fā)店時所能容忍的等待時間+剪發(fā)時間是3小時,而且等待時間越長,顧客的滿意度越低。如果3個小時還不能剪完頭發(fā),我們的顧客會立馬生氣的走人。
通過上面的假設(shè)我們不難想象出下面的場景:
1. 當(dāng)理發(fā)店內(nèi)只有1位顧客時,只需要有1名理發(fā)師為他提供服務(wù),其他兩名理發(fā)師可能繼續(xù)等著,也可能會幫忙打打雜。1小時后,這位顧客剪完頭發(fā)出門走了。那么在這1個小時里,整個理發(fā)店只服務(wù)了1位顧客,這位顧客花費在這次剪發(fā)的時間是1小時;
2. 當(dāng)理發(fā)店內(nèi)同時有兩位顧客時,就會同時有兩名理發(fā)師在為顧客服務(wù),另外1位發(fā)呆或者打雜幫忙。仍然是1小時后,兩位顧客剪完頭發(fā)出門。在這1小時里,理發(fā)店服務(wù)了兩位顧客,這兩位顧客花費在剪發(fā)的時間均為1小時;
3. 很容易理解,當(dāng)理發(fā)店內(nèi)同時有三位顧客時,理發(fā)店可以在1小時內(nèi)同時服務(wù)三位顧客,每位顧客花費在這次剪發(fā)的時間仍然是均為1小時;
從上面幾個場景中我們可以發(fā)現(xiàn),在理發(fā)店同時服務(wù)的顧客數(shù)量從1位增加到3位的過程中,隨著顧客數(shù)量的增多,理發(fā)店的整體工作效率在提高,但是每位顧客在理發(fā)店內(nèi)所呆的時間并未延長。
當(dāng)然,我們可以假設(shè)當(dāng)只有1位顧客和2位顧客時,空閑的理發(fā)師可以幫忙打雜,使得其他理發(fā)師的工作效率提高,并使每位顧客的剪發(fā)時間小于1小時。不過即使根據(jù)這個假設(shè),雖然隨著顧客數(shù)量的增多,每位顧客的服務(wù)時間有所延長,但是這個時間始終還被控制在顧客可接受的范圍之內(nèi),并且顧客是不需要等待的。
不過隨著理發(fā)店的生意越來越好,顧客也越來越多,新的場景出現(xiàn)了。假設(shè)有一次顧客A、B、C剛進(jìn)理發(fā)店準(zhǔn)備剪發(fā),外面一推門又進(jìn)來了顧客D、E、F。因為A、B、C三位顧客先到,所以D、E、F三位只好坐在長板凳上等著。1小時后,A、B、C三位剪完頭發(fā)走了,他們每個人這次剪發(fā)所花費的時間均為1小時。可是D、E、F三位就沒有這么好運,因為他們要先等A、B、C三位剪完才能剪,所以他們每個人這次剪發(fā)所花費的時間均為2小時——包括等待1小時和剪發(fā)1小時。
通過上面這個場景我們可以發(fā)現(xiàn),對于理發(fā)店來說,都是每小時服務(wù)三位顧客——第1個小時是A、B、C,第二個小時是D、E、F;但是對于顧客D、E、F來說,“響應(yīng)時間”延長了。如果你可以理解上面的這些場景,就可以繼續(xù)往下看了。
在新的場景中,我們假設(shè)這次理發(fā)店里一次來了9位顧客,根據(jù)我們上面的場景,相信你不難推斷,這9位顧客中有3位的“響應(yīng)時間”為1小時,有3位的“響應(yīng)時間”為2小時(等待1小時+剪發(fā)1小時),還有3位的“響應(yīng)時間”為3小時(等待2小時+剪發(fā)1小時)——已經(jīng)到達(dá)用戶所能忍受的極限。假如在把這個場景中的顧客數(shù)量改為10,那么我們已經(jīng)可以斷定,一定會有1位顧客因為“響應(yīng)時間”過長而無法忍受,最終離開理發(fā)店走了。
我想并不需要特別說明,大家也一定可以把上面的這些場景跟性能測試掛上鉤了。如果你還是覺得比較抽象,繼續(xù)看下面的這張圖 ^_^

這張圖中展示的是1個標(biāo)準(zhǔn)的軟件性能模型。在圖中有三條曲線,分別表示資源的利用情況(Utilization,包括硬件資源和軟件資源)、吞吐量(Throughput,這里是指每秒事務(wù)數(shù))以及響應(yīng)時間(Response Time)。圖中坐標(biāo)軸的橫軸從左到右表現(xiàn)了并發(fā)用戶數(shù)(Number of Concurrent Users)的不斷增長。
在這張圖中我們可以看到,最開始,隨著并發(fā)用戶數(shù)的增長,資源占用率和吞吐量會相應(yīng)的增長,但是響應(yīng)時間的變化不大;不過當(dāng)并發(fā)用戶數(shù)增長到一定程度后,資源占用達(dá)到飽和,吞吐量增長明顯放緩甚至停止增長,而響應(yīng)時間卻進(jìn)一步延長。如果并發(fā)用戶數(shù)繼續(xù)增長,你會發(fā)現(xiàn)軟硬件資源占用繼續(xù)維持在飽和狀態(tài),但是吞吐量開始下降,響應(yīng)時間明顯的超出了用戶可接受的范圍,并且最終導(dǎo)致用戶放棄了這次請求甚至離開。
根據(jù)這種性能表現(xiàn),圖中劃分了三個區(qū)域,分別是Light Load(較輕的壓力)、Heavy Load(較重的壓力)和Buckle Zone(用戶無法忍受并放棄請求)。在Light Load和Heavy Load 兩個區(qū)域交界處的并發(fā)用戶數(shù),我們稱為“最佳并發(fā)用戶數(shù)(The Optimum Number of Concurrent Users)”,而Heavy Load和Buckle Zone兩個區(qū)域交界處的并發(fā)用戶數(shù)則稱為“最大并發(fā)用戶數(shù)(The Maximum Number of Concurrent Users)”。
當(dāng)系統(tǒng)的負(fù)載等于最佳并發(fā)用戶數(shù)時,系統(tǒng)的整體效率最高,沒有資源被浪費,用戶也不需要等待;當(dāng)系統(tǒng)負(fù)載處于最佳并發(fā)用戶數(shù)和最大并發(fā)用戶數(shù)之間時,系統(tǒng)可以繼續(xù)工作,但是用戶的等待時間延長,滿意度開始降低,并且如果負(fù)載一直持續(xù),將最終會導(dǎo)致有些用戶無法忍受而放棄;而當(dāng)系統(tǒng)負(fù)載大于最大并發(fā)用戶數(shù)時,將注定會導(dǎo)致某些用戶無法忍受超長的響應(yīng)時間而放棄。
對應(yīng)到我們上面理發(fā)店的例子,每小時3個顧客就是這個理發(fā)店的最佳并發(fā)用戶數(shù),而每小時9個顧客則是它的最大并發(fā)用戶數(shù)。當(dāng)每小時都有3個顧客到來時,理發(fā)店的整體工作效率最高;而當(dāng)每小時都有9個顧客到來時,前幾個小時來的顧客還可以忍受,但是隨著等待的顧客人數(shù)越來越多,等待時間越來越長,最終還是會有顧客無法忍受而離開。同時,隨著理發(fā)店里顧客人數(shù)的增多和理發(fā)師工作時間的延長,理發(fā)師會逐漸產(chǎn)生疲勞,還要多花一些時間來清理環(huán)境和維持秩序,這些因素將最終導(dǎo)致理發(fā)師的工作效率隨著顧客人數(shù)的增多和工作的延長而逐漸的下降,到最后可能要1.5小時甚至2個小時才能剪完1個發(fā)了。
當(dāng)然,如果一開始就有10個顧客到來,則注定有1位顧客剪不到頭發(fā)了。
進(jìn)一步理解“最佳并發(fā)用戶數(shù)”和“最大并發(fā)用戶數(shù)”
在上一節(jié)中,我們詳細(xì)的描述了并發(fā)用戶數(shù)同資源占用情況、吞吐量以及響應(yīng)時間的關(guān)系,并且提到了兩個新的概念——“最佳并發(fā)用戶數(shù)(The Optimum Number of Concurrent Users)”和“最大并發(fā)用戶數(shù)(The Maximum Number of Concurrent Users)”。在這一節(jié)中,我們將對“最佳并發(fā)用戶數(shù)”和“最大并發(fā)用戶數(shù)”的定義做更加清晰和明確的說明。
對于一個確定的被測系統(tǒng)來說,在某個具體的軟硬件環(huán)境下,它的“最佳并發(fā)用戶數(shù)”和“最大并發(fā)用戶數(shù)”都是客觀存在。以“最佳并發(fā)用戶數(shù)”為例,假如一個系統(tǒng)的最佳并發(fā)用戶數(shù)是50,那么一旦并發(fā)量超過這個值,系統(tǒng)的吞吐量和響應(yīng)時間必然會 “此消彼長”;如果系統(tǒng)負(fù)載長期大于這個數(shù),必然會導(dǎo)致用戶的滿意度降低并最終達(dá)到一種無法忍受的地步。所以我們應(yīng)該 保證最佳并發(fā)用戶數(shù)要大于系統(tǒng)的平均負(fù)載。
要補充的一點是,當(dāng)我們需要對一個系統(tǒng)長時間施加壓力——例如連續(xù)加壓3-5天,來驗證系統(tǒng)的可靠性或者說穩(wěn)定性時,我們所使用的并發(fā)用戶數(shù)應(yīng)該等于或小于“最佳并發(fā)用戶數(shù)”——大家也可以結(jié)合上面的討論想想這是為什么 ^_^
而對于最大并發(fā)用戶數(shù)的識別,需要考慮和鑒別一下以下兩種情況:
1. 當(dāng)系統(tǒng)的負(fù)載達(dá)到最大并發(fā)用戶數(shù)后,響應(yīng)時間超過了用戶可以忍受的最大限度——這個限度應(yīng)該來源于性能需求,例如:在某個級別的負(fù)載下,系統(tǒng)的響應(yīng)時間應(yīng)該小于5秒。這里容易疏忽的一點是,不要把顧客因為無法忍受而離開時店內(nèi)的顧客數(shù)量作為理發(fā)店的“最大并發(fā)用戶數(shù)”,因為這位顧客是在3小時前到達(dá)的,也就是說3小時前理發(fā)店內(nèi)的顧客數(shù)量才是我們要找的“最大并發(fā)用戶數(shù)”。而且,這位顧客的離開只是一個開始,可能有會更多的顧客隨后也因為無法忍受超長的等待時間而離開;
2. 在響應(yīng)時間還沒有到達(dá)用戶可忍受的最大限度前,有可能已經(jīng)出現(xiàn)了用戶請求的失敗。以理發(fā)店模型為例,如果理發(fā)店只能容納6位顧客,那么當(dāng)7位顧客同時來到理發(fā)店時,雖然我們可以知道所有顧客都能在可容忍的時間內(nèi)剪完頭發(fā),但是因為理發(fā)店容量有限,最終只好有一位顧客打道回府,改天再來。
對于一個系統(tǒng)來說,我們應(yīng)該 確保系統(tǒng)的最大并發(fā)用戶數(shù)要大于系統(tǒng)需要承受的峰值負(fù)載。
如果你已經(jīng)理解了上面提到的全部的概念,我想你可以展開進(jìn)一步的思考,回頭看一下自己以往做過的性能測試,看看是否可以對以往的工作產(chǎn)生新的理解。也歡迎大家在這里提出自己的心得或疑惑,繼續(xù)討論下去。
理發(fā)店模型的進(jìn)一步擴展
這一節(jié)中我會提到一些對理發(fā)店模型的擴展,當(dāng)然,我依然是只講述現(xiàn)實中的理發(fā)店的故事,至于如何將這些擴展同性能測試以及性能解決方案等方面關(guān)聯(lián)起來,就留給大家繼續(xù)思考了 ^_^
擴展場景1:有些顧客已經(jīng)是理發(fā)店的老顧客,他們和理發(fā)師已經(jīng)非常熟悉,理發(fā)師可以不用花費太多時間溝通就知道這位顧客的想法。并且理發(fā)師對這位顧客的腦袋的形狀也很熟悉,所以可以更快的完成一次理發(fā)的工作。
擴展場景2:理發(fā)店并不是只有剪發(fā)一種業(yè)務(wù),還提供了燙發(fā)染發(fā)之類的業(yè)務(wù),那么當(dāng)顧客提出新的要求時,理發(fā)師服務(wù)一位顧客的時間可能會超過標(biāo)準(zhǔn)的1小時。而且這時如果要計算每位顧客的等待時間就變得復(fù)雜了很多,有些顧客的排隊時間會比原來預(yù)計的延長,并最終導(dǎo)致他們因為無法忍受而離開。
擴展場景3:隨著燙發(fā)和染發(fā)業(yè)務(wù)的增加,理發(fā)師們決定分工,兩位專門剪發(fā),一位專門負(fù)責(zé)燙發(fā)和染發(fā)。
擴展場景4:理發(fā)店的生意越來越好,理發(fā)師的數(shù)量和理發(fā)店的門面已經(jīng)無法滿足顧客的要求,于是理發(fā)店的老板決定在旁邊再開一家店,并招聘一些工作能力更強的理發(fā)師。
擴展場景5:理發(fā)店的生意變得極為火爆了,兩家店都無法滿足顧客數(shù)量增長的需求,并且有些顧客開始反映到理發(fā)店的路途太遠(yuǎn),到了以后又因為燙發(fā)和染發(fā)的人太多而等太久。可是理發(fā)店的老板也明白燙發(fā)和染發(fā)的收入要遠(yuǎn)遠(yuǎn)高于剪發(fā)阿,于是他腦筋一轉(zhuǎn),決定繼續(xù)改變策略,在附近的幾個大型小區(qū)租用小的鋪面開設(shè)分店,專職剪發(fā)業(yè)務(wù);再在市區(qū)的繁華路段開設(shè)旗艦店,專門為燙發(fā)、染發(fā)的顧客,以及VIP顧客服務(wù)。并增設(shè)800電話,當(dāng)顧客想要剪發(fā)時,可以撥打這個電話,并由服務(wù)人員根據(jù)顧客的居住地點,將其指引到距離最近的一家分店去。
這篇文章就先寫到這里了,希望大家在看完之后可以繼續(xù)思考一下,也寫出自己的心得體會或者新的想法,記下自己的不解和疑惑,讓我們在不斷的交流和討論中走的更遠(yuǎn) ^_^
性能測試相關(guān)術(shù)語的英文書寫方法(不斷更新ing)——知道了這些術(shù)語在英文中的正確書寫方法之后,可以通過 Google 更加高效的獲取到更多有用的資料。