天天看點

性能測試(一)——理發店模型

這個理發店模型是在網絡上看來的,之後對性能測試有了一定的了解之後,感覺寫的很好,現在結合自己的一點想法,将理發店模型完整的記錄下來。

文中很多是來自jackei和蟲師的部落格,估計這兩個部落格大家都不陌生。

理發店模型

理發店模型,可以很好的用來了解很多性能測試的概念和理論,以及一些測試中遇到的問題,将本來抽象的概念具體化,聯合實際,可能很多地方沒有很好的切合,但是這個模型确實幫助我了解了很多點。

在我們的這個理發店中,我們事先做了如下的假設:

1.   理發店共有3名理發師;

2.   每位理發師剪一個發的時間都是1小時;

3.   我們顧客們都是很有時間觀念的人而且非常挑剔,他們對于每次光顧理發店時所能容忍的等待時間+剪發時間是3小時,而且等待時間越長,顧客的滿意度越低。如果3個小時還不能剪完頭發,顧客會立馬生氣的走人。

通過上面的假設可以想象出下面的這些場景:

1.        當理發店内隻有1位顧客時,隻需要有1名理發師為他提供服務,其他兩名理發師可能繼續等着,也可能會幫忙打打雜。1小時後,這位顧客剪完頭發出門走了。那麼在這1個小時裡,整個理發店隻服務了1位顧客,這位顧客花費在這次剪發的時間是1小時;

2.      當理發店内同時有兩位顧客時,就會同時有兩名理發師在為顧客服務,另外1位發呆或者打雜幫忙。仍然是1小時後,兩位顧客剪完頭發出門。在這1小時裡,理發店服務了兩位顧客,這兩位顧客花費在剪發的時間均為1小時;

3.      很容易了解,當理發店内同時有三位顧客時,理發店可以在1小時内同時服務三位顧客,每位顧客花費在這次剪發的時間仍然是均為1小時;

       從上面幾個場景中我們可以發現,在理發店同時服務的顧客數量從1位增加到3位的過程中,随着顧客數量的增多,理發店的整體工作效率在提高,但是每位顧客在理發店内所呆的時間并未延長。當然,我們可以假設當隻有1位顧客和2位顧客時,空閑的理發師可以幫忙打雜,使得其他理發師的工作效率提高,并使每位顧客的剪發時間小于1小時。不過即使根據這個假設,雖然随着顧客數量的增多,每位顧客的服務時間有所延長,但是這個時間始終還被控制在顧客可接受的範圍之内,并且顧客是不需要等待的。

       不過随着理發店的生意越來越好,顧客也越來越多,新的場景出現了。假設有一次顧客A、B、C剛進理發店準備剪發,外面一推門又進來了顧客D、E、F。因為A、B、C三位顧客先到,是以D、E、F三位隻好坐在長闆凳上等着。1小時後,A、B、C三位剪完頭發走了,他們每個人這次剪發所花費的時間均為1小時。可是D、E、F三位就沒有這麼好運,因為他們要先等A、B、C三位剪完才能剪,是以他們每個人這次剪發所花費的時間均為2小時——包括等待1小時和剪發1小時。

       通過上面這個場景我們可以發現,對于理發店來說,都是每小時服務三位顧客——第1個小時是A、B、C,第二個小時是D、E、F;但是對于顧客D、E、F來說,“響應時間”延長了。如果你可以了解上面的這些場景,就可以繼續往下看了。

       在新的場景中,我們假設這次理發店裡一次來了9位顧客,根據我們上面的場景,相信你不難推斷,這9位顧客中有3位的“響應時間”為1小時,有3位的“響應時間”為2小時(等待1小時+剪發1小時),還有3位的“響應時間”為3小時(等待2小時+剪發1小時)——已經到達使用者所能忍受的極限。假如在把這個場景中的顧客數量改為10,那麼我們已經可以斷定,一定會有1位顧客因為“響應時間”過長而無法忍受,最終離開理發店走了。

性能測試(一)——理發店模型

       這張圖中展示的是1個标準的軟體性能模型。在圖中有三條曲線,分别表示資源的利用情況(Utilization,包括硬體資源和軟體資源)、吞吐量(Throughput,這裡是指每秒事務數)以及響應時間(Response Time)。圖中坐标軸的橫軸從左到右表現了并發使用者數(Number of Concurrent Users)的不斷增長。在這張圖中我們可以看到,最開始,随着并發使用者數的增長,資源占用率和吞吐量會相應的增長,但是響應時間的變化不大;不過當并發使用者數增長到一定程度後,資源占用達到飽和,吞吐量增長明顯放緩甚至停止增長,而響應時間卻進一步延長。如果并發使用者數繼續增長,你會發現軟硬體資源占用繼續維持在飽和狀态,但是吞吐量開始下降,響應時間明顯的超出了使用者可接受的範圍,并且最終導緻使用者放棄了這次請求甚至離開。

      根據這種性能表現,圖中劃分了三個區域,分别是Light Load(較輕的壓力)、Heavy Load(較重的壓力)和Buckle Zone(使用者無法忍受并放棄請求)。在Light Load和Heavy Load 兩個區域交界處的并發使用者數,我們稱為“最佳并發使用者數(The Optimum Number of Concurrent Users)”,而Heavy Load和Buckle Zone兩個區域交界處的并發使用者數則稱為“最大并發使用者數(The Maximum Number of Concurrent Users)”。

      當系統的負載等于最佳并發使用者數時,系統的整體效率最高,沒有資源被浪費,使用者也不需要等待;當系統負載處于最佳并發使用者數和最大并發使用者數之間時,系統可以繼續工作,但是使用者的等待時間延長,滿意度開始降低,并且如果負載一直持續,将最終會導緻有些使用者無法忍受而放棄;而當系統負載大于最大并發使用者數時,将注定會導緻某些使用者無法忍受超長的響應時間而放棄。

了解:

最佳并發使用者數:每小時3位顧客,即理發店收入最多(理發師傅沒有休息時間,一直在理發),顧客滿意度最高(顧客随時到随時理,無需要等待)。

最大并發使用者數:每小時9位顧客,理發店的最大承受狀态,理發店收入最多(理發師傅沒有休息時間,一直在理發),顧客的最大忍耐度(來的顧客等待+理發需要等上三個小時)。當每小時都有9個顧客到來時,前幾個小時來的顧客還可以忍受,但是随着等待的顧客人數越來越多,等待時間越來越長,最終還是會有顧客無法忍受而離開。同時,随着理發店裡顧客人數的增多和理發師工作時間的延長,理發師會逐漸産生疲勞,還要多花一些時間來清理環境和維持秩序,這些因素将最終導緻理發師的工作效率随着顧客人數的增多和工作的延長而逐漸的下降,到最後可能要1.5小時甚至2個小時才能剪完1個發了。如果一開始就有10個顧客到來,則注定有1位顧客剪不到頭發了。當然,理發店還會不斷的來新的顧客,不斷有等了三小時而沒有得到服務的顧客離開,但對于理發店而言,他們在一個時間點上,能服務的最大使用者數是9(3位正在接受服務、3位已經等待一小時,3位已經等待兩小時)。

       對于一個确定的被測系統來說,在某個具體的軟硬體環境下,它的“最佳并發使用者數”和“最大并發使用者數”都是客觀存在。以“最佳并發使用者數”為例,假如一個系統的最佳并發使用者數是50,那麼一旦并發量超過這個值,系統的吞吐量和響應時間必然會 “此消彼長”;如果系統負載長期大于這個數,必然會導緻使用者的滿意度降低并最終達到一種無法忍受的地步。是以我們應該 保證最佳并發使用者數要大于系統的平均負載。要補充的一點是,當我們需要對一個系統長時間施加壓力——例如連續加壓3-5天,來驗證系統的可靠性或者說穩定性時,我們所使用的并發使用者數應該等于或小于“最佳并發使用者數”

 對于最大并發使用者數的識别,需要考慮和鑒别一下以下兩種情況:

1. 在理發店裡很大,可以容納很多位顧客(大于9),總有一部分在這裡等待了三小時而沒有得到服務離開,不要把等待了三小時而沒有得到服務的顧客納入最大使用者數裡。也就是說3小時前理發店内的顧客數量才是我們要找的“最大并發使用者數”。而且,這位顧客的離開隻是一個開始,可能有會更多的顧客随後也因為無法忍受超長的等待時間而離開;

2.  在響應時間還沒有到達使用者可忍受的最大限度前,有可能已經出現了使用者請求的失敗。假如理發店很小,最多隻能容納六位顧客,當第七個顧客來時,雖然,我們知道他隻需要等待兩小時就可得到服務(這個時間是他可以接受的等待時間),但由于理發店容量有量,這第七個顧客隻有改天再來了。

對于一個系統來說,我們應該確定系統的最大并發使用者數要大于系統需要承受的峰值負載。

理發店模型的進一步擴充

擴充場景1:有些顧客已經是理發店的老顧客,他們和理發師已經非常熟悉,理發師可以不用花費太多時間溝通就知道這位顧客的想法。并且理發師對這位顧客的腦袋的形狀也很熟悉,是以可以更快的完成一次理發的工作。

擴充場景2:理發店并不是隻有剪發一種業務,還提供了燙發染發之類的業務,那麼當顧客提出新的要求時,理發師服務一位顧客的時間可能會超過标準的1小時。而且這時如果要計算每位顧客的等待時間就變得複雜了很多,有些顧客的排隊時間會比原來預計的延長,并最終導緻他們因為無法忍受而離開。

擴充場景3:随着燙發和染發業務的增加,理發師們決定分工,兩位專門剪發,一位專門負責燙發和染發。

擴充場景4:理發店的生意越來越好,理發師的數量和理發店的門面已經無法滿足顧客的要求,于是理發店的老闆決定在旁邊再開一家店,并招聘一些工作能力更強的理發師。

擴充場景5:理發店的生意變得極為火爆了,兩家店都無法滿足顧客數量增長的需求,并且有些顧客開始反映到理發店的路途太遠,到了以後又因為燙發和染發的人太多而等太久。可是理發店的老闆也明白燙發和染發的收入要遠遠高于剪發阿,于是他腦筋一轉,決定繼續改變政策,在附近的幾個大型小區租用小的鋪面開設分店,專職剪發業務;再在市區的繁華路段開設旗艦店,專門為燙發、染發的顧客,以及VIP顧客服務。并增設800電話,當顧客想要剪發時,可以撥打這個電話,并由服務人員根據顧客的居住地點,将其指引到距離最近的一家分店去。

對模型的了解:

理發店就相當于我們的系統,顧客就我們向伺服器所發送的請求,最佳使用者數和最大使用者數是我們衡量一個系統的處理能力的一種方法。理發師們的分工就是在對伺服器處理不同請求的分工,擴充的場景就是對b/s的系統的一個縮影,随着生意越來越好,網站流量越來越多,系統的整體架構需要發生相應的改變,一滿足使用者的需求。在遇到難以了解的術語時,時常想想這個理發店模型就可以很好的了解性能測試。一個CPU相當于一個理發師,一個伺服器又有幾個CPU,當業務擴充的時候,需要增加CPU,再增長的時候需要增加伺服器;業務達到一定的水準的時候分成專門的伺服器提供具體的服務;電話相當于一個域名解析伺服器,根據不同的送出服務轉到不同的伺服器。 針對不同的使用者的性能需求可以将功能分解起來測試。 

微觀上來說,在單CPU的情況下,并不存在真正意義上的并發響應(并發請求是可能的),那麼3個理發師同時工作如何解釋上述問題?作業系統實際上是分時處理的系統,CPU 時間被以時間片為機關輪流配置設定給不同的程序——但是作業系統的這種做法本身也是為了讓每個程序都感覺到自己在獨占 CPU。從這個角度來說,如果我們的理發師可以以極為快速(例如10ms一個間隔)的速度在三位顧客之間切換,而且這個切換是我們根本無法發現或者識别的,我們是否可以認為相當于有三位理發師同時在為顧客服務呢? 

轉載于:https://www.cnblogs.com/silence-hust/p/4072821.html

繼續閱讀