性能分析之排队论应用
文章目錄
- 一、前言
- 二、排隊模型
- 1、M/M/1/∞ /∞ /FCFS:單線程單連接,先到先服務
- 2、M/M/C/∞ /∞ /FCFS:多線程多連接,先到先服務
- 三、排隊的計算
- 1、排隊計算 1
- 2、排隊計算 2
- 3、排隊計算 3
- 4、小結
- 四、數據統計分析
- 1、請求到達率
- 2、響應時間分布
- 3、小結
- 五、創建 M/M/C/∞ /∞ /FCFS 模型
- 六、總結
一、前言
之所以寫排隊論的話題是因為這個理論和性能分析中的隊列分析有關。
這里我盡量不寫和數學相關的公式,只寫分析部分,以免看得人心塞。
寫之前先說幾個假設條件(在最后會對這幾個條件加以說明):
- 每請求的響應時間相同(為什么要做這個假設?是因為不想計算得太復雜)
- 每個服務器提供穩定的服務,沒有抖動
- 到達分布是滿足泊松分布的
- 響應時間分布是滿足指數分布的
二、排隊模型
1、M/M/1/∞ /∞ /FCFS:單線程單連接,先到先服務
(注:以上是 kendall 表達式)
在下圖中有幾個前提條件需要說明,單連接單服務進程。
如果這個連接中的前 8 個請求可以進入系統得到響應,并且同時還有兩個空位,也就是說系統可以同時處理 10 個請求的話,那再接著到達系統的前兩個請求就可以立即得到響應。那么后續的兩個請求將進入隊列等待。
這就是最簡單的模型:M/M/1/∞ /∞ /FCFS。
2、M/M/C/∞ /∞ /FCFS:多線程多連接,先到先服務
(注:以上是 kendall 表達式)
當然大部分系統都不會是上面這個樣子,而是下面這個樣子。
在下圖中,就是進來的連接通道有 4 個(有人問為什么是 4 個呢,是因為畫多了太亂)。
如果每個連接中的前 8 個請求到達系統可以得到響應,后續兩個也可以得到響應。那再后續的兩個就必然進入隊列等待。
這就是另一個模型:M/M/C/∞ /∞ /FCFS。
基于第二個模型標識下相應的數學符號:
三、排隊的計算
代入相應的數據計算(因為數學公式實在是帖起來太費勁,并且看起來眼暈,這里我就直接把代入數據后的結果帖出來)。
1、排隊計算 1
上表中有幾個輸入值,即 λ/μ/c,這幾個值都是可以從系統中得到,或者測試出來的。下面的值部分是通過計算得來的。其中也有一個假設值就是標準方差,之所以現在的計算沒有加入標準方差是想減少計算的復雜度。
2、排隊計算 2
從上面的數據可以看到實際系統的處理能力是 2000請求/秒。那如果是 2000 請求同時到達系統會是什么樣呢?如下所示:
也就是說如果到達請求數和系統的能力一致的話,響應時間是不變的,但是服務強度、線程空閑率、新請求的排隊概率、每線程的平均請求數等都變了。
3、排隊計算 3
如果到達的請求數持續大于系統能力呢?如下所示:
從上表可以看到,如果到達系統的請求數持續超過系統的處理能力的話,那將導致響應時間變長,并且都長在了排隊中。
4、小結
通過排隊的計算可以知道:
-
系統當前是否負載過重;
-
系統如果想滿足更高的并發應該增加多少處理線程;
-
系統的超時應該如何設計;
-
系統的容量應該如何評估;
以上的計算過于理想化,在現實的環境中當然不會是這樣的結果,所以本文的標題是簡述。
在現實的環境計算中,有幾個點是需要再細究的(對應開篇的假設條件)。
- 到達率:通過系統中的請求到達時間點統計之后,通過卡方檢驗判斷到達率滿足哪種分布模型;
- 響應時間的標準方差:通過統計響應時間,計算標準方差后代入計算,則響應時間也會受到影響;
- 系統的處理能力:在系統有峰值持續時間對響應時間和超時設計的要求;
對這些做細致的統計分析之后,才能對一個系統容量有比較好的指導作用。
四、數據統計分析
今天就說明兩個重要的輸入數據的獲取和分布說明。
這里以一個示例來說明一下,在 7D Group 的 server上 搭了一個簡單的應用,我用 jmeter 做了一個最簡單的腳本,一個 get 就結束。
如果想分析更復雜的系統,可以將整個業務流做為分析對象,粒度的選取對分析的結果會有影響,所以要確定自己的分析目標。
1、請求到達率
通過 nginx 的日志(用 tomcat 的日志也可以)分析得到如下到達時間分布和頻率如下:
單位:s
通過 K-S 檢驗結果如下:
可見到達分布是符合泊松分布的。
2、響應時間分布
通過 nginx 的日志(用 tomcat 的日志也可以)分析得到如下響應時間如下表所示:
單位:ms
通過 K-S 檢驗結果如下:
可見響應時間是符合指數分布的。
這兩個數據滿足了 M/M/C/∞ /∞ /FCFS 的條件,接下來就可以用這個模型的相應計算方法來計算了。
對其他的排隊模型也是一樣需要分析模型的前提條件。所以對實際數據的分析就非常重要。
3、小結
要創建一個成型的排隊模型,有到達率和響應時間分析是不夠的,還需要幾個數據:
-
設定到達率隨機數種子,以確定生成的隨機數可重復且要滿足真實的分布,不然模型不可復用;
-
確定隊列長度和等待時間;
-
確定有幾個串行隊列和并行服務器;
當我們面對一個更復雜的系統時,也一定不要慌亂,數據分析是一個理智的過程。
五、創建 M/M/C/∞ /∞ /FCFS 模型
本文使用這個模型,因為這個是比較典型的排隊場景,在性能的場景中經常可以遇到。
定義如下參數:
set.seed(2) # 定義隨機數種子,以保證隨機數據具有可重復性 Requests<- 1000000 #請求數 ArrivalRate <- 1/2 #到達率 SeviceRate <- 1/3 #服務率 Threads = 10 # 定義線程個數通過一些計算,得到一些中間數據:
interarrivals <- rexp(Requests, ArrivalRate) #請求分布 arrivals <- cumsum(interarrivals) #請求總數 service <- rexp(Requests, SeviceRate) #請求得到的服務分布 rho <- (1/SeviceRate) / (1/ArrivalRate) #服務強度 Vectorize(P_n, "n")(rho=rho, n=c(0:30), k = k) #向量化轉化通過排隊模型計算得如下結果(算法請參考排隊論相關書籍,只要用語言實現即可,本文用 R 語言示例,只要知道算法,用 excel也是可以的):
系統內的響應時間: # Mean response time (time in system) [1] 2.500001請求平均響應時間: # Mean response time [1] 2.996585六、總結
在創建模型時,需要將相關的參數考慮進來,以確定對模型的影響。
不管是在宏觀分析,還是在微觀分析上,只要思路清晰,都可以用排隊論來分析性能,前提是要理解如何用。不要亂用。
前面提到了一些基本的概念和數據獲取及分布分析,這些都是有成型的工具可以完成,像 SPSS 就可以完成卡方檢驗或 K-S 檢驗,以確定數據是否是泊松分布或指數分布。因為確定了分布之后,才可以用相應的排隊論表達式和公式來完成后面的計算。
系統數據有些比較規整(比如說一般分布的馬爾可夫到達鏈),有些比較復雜(各種不同的分布模型)。需要對這些都進行了分析之后,才能創建出適合的模型出來。所以抓取一些數據做統計分析就非常重要了。
我的目的是通過這樣的計算可以得到比較通用的模型(不是絕對能用哦),在不同的場景下都可以通過得到一些基本的數據信息之后,加以整理分析,就可以得到可以復用的排隊模型,并最終指導生產運營的推導需求。
這樣就可以避免部分在生產環境上的問題,不用花大量的時間成本去做分析,即可知道要加多少服務器,要支持多少個用戶,用戶的響應時間變化曲線等等。
總結
以上是生活随笔為你收集整理的性能分析之排队论应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RecyclerView与ViewPag
- 下一篇: JDK环境变量设置以及检验是否配置成功