最近在做webrtc,其中的signaling server用workerman寫的,客戶端的長聯(lián)也是用workerman寫的,但是發(fā)現(xiàn)gateway連接數(shù)不平均,某個gateway承擔了絕大部分的連接數(shù),這是哪里問題呢?求幫助求解答。如圖
[attach]577[/attach]
workerman里默認鏈接分配流程:
當客戶端連上來時,客戶端鏈接先被操作系統(tǒng)放到一個隊列里,每個workerman子進程都能感知到隊列里有新的鏈接,如果子進程這時候是空閑的,就會去隊列里去獲取這個新鏈接。反之如果子進程在忙(執(zhí)行業(yè)務邏輯、發(fā)送數(shù)據(jù)等等)就不會去獲取這個新鏈接。多個子進程都去獲取這個鏈接,只會有一個進程成功。
所以在系統(tǒng)空閑并且連接數(shù)比較少的的情況下比較容易出現(xiàn)不太均勻的情況,但是不用擔心,說明子進程能夠處理這些鏈接,如果進程真的處理這些鏈接有些吃力時,也就是它比較繁忙時,鏈接會優(yōu)先被連接數(shù)比較少或者比較空閑的進程認領,整個系統(tǒng)一直會保持一個比較均勻的分布。
如果想要連接數(shù)嚴格的被分配給各個進程,可以開啟http://doc3.workerman.net/worker-development/reuse-port.html;,這樣就是操作系統(tǒng)內(nèi)核自動分配鏈接給個個進程,而不是每個進程去認領進程,這樣每個進程獲取的連接數(shù)就一樣多了。gateway->reusePort這個特性需要PHP>=7.0。