什麼是分散式系統的利特爾定律? - nurkiewicz

banq發表於2022-02-26

利特爾定律(Little's law)是一個令人震驚的方程式,它非常簡單,但它可以為你的分散式系統的能力帶來驚人的洞察力。

舉例:首先,假設我們去一個雜貨店。想象一下,有一個店員,平均在四分鐘內處理一個顧客。很明顯,他可以提供服務:60分鐘除以4--每小時15個顧客。這是可持續的到達率。如果為一個顧客服務需要三分鐘而不是四分鐘,那麼數學就很簡單了。六十分鐘除以三。這使得每小時有二十名顧客。正如你所看到的,店員處理顧客的速度越快,他或她在給定的時間單位內能處理的顧客就越多。

但如果我們增加第二個店員呢?我們假設他或她有同等的吞吐量,以服務一個顧客的平均時間來衡量。我們系統的吞吐量突然增加了一倍。這還是在假設店員之間是獨立的。他們之間不需要同步。同時,也沒有共享的資源需要他們去等待。每個店員都有自己的登記簿。因此,不再是每小時20個顧客,而是每小時40個顧客。你可能可以猜到,增加第三個店員也會增加商店的吞吐量。應該很容易算出,總體吞吐量等於一個店員的吞吐量乘以店員的數量。在上述假設下。

信不信由你,這就是利特爾/李特定律的全部光輝。利特爾定律本質上是說,我們每小時能服務的顧客數量與辦事員的數量成正比。但它也與平均處理時間成反比。為一個顧客服務的時間越長,我們得到的吞吐量就越少。工作人員的數量除以平均交易時間。這就是了!

讓我們回到分散式系統和IT。在我們的行業中,我們可以透過用CPU/伺服器/執行緒/程式取代辦事員來使用李特定律。我們不用衡量完成結賬的時間,而是用交易或請求-響應時間。在所有這些情況下,真正令人驚訝的是,這些是唯一的依賴關係。例如這一定律不受響應時間分佈的影響(如常數與正常數與指數數)。它也不受客戶到達率分佈的影響。在一個穩定的系統中,即使我們只知道平均數,它也是有效的。我們所需要的是每秒平均請求數、平均響應時間和吞吐量。知道了其中兩個,我們就可以計算出第三個。

讓我們舉一個具體的例子。想象一下,處理CPU密集型請求的Node.js伺服器。Node.js是著名的單執行緒,所以如果一個請求需要你的CPU 100毫秒,我們每秒最多可以有效地處理十個請求。然而,如果我們在負載平衡器後面部署四個Node.js伺服器,我們的理論吞吐量就會增長到每秒40個請求。另一方面,讓我們來看看老式的Tomcat伺服器,預設配置了100個工作執行緒。如果一個交易是IO繫結的,平均需要100毫秒,那麼這個Tomcat例項每秒可以提供1000個請求。注意我說的是IO-bound。如果這個Tomcat例項上的事務是受CPU約束的,我們就使用可用的CPU核心數,而不是執行緒數來計算。

利特爾定律的神奇之處在於很多原因。首先,它允許你在對系統內部知之甚少的情況下估算出系統的理論最大吞吐量。你只需要知道你的瓶頸是什麼(伺服器、CPU、資料庫連線),或者反過來說,你需要多少資源來維持給定的流量,在你的SLA中列出。如果你考慮到它是多麼的簡單,那就更令人吃驚了。無論傳入請求的分佈如何,無論你是否有隨機的GC暫停,等等,它都能發揮作用。你只需在平均數上下功夫。

相關文章