最近在nginx1 9 1中支援了reuse port這個功能 是准許多個socket監聽同乙個埠?

時間 2021-05-05 17:49:54

1樓:濤叔

讓多個worker都監聽了同乙個埠

這個說法是不準確的,具體參見我的另乙個回答nginx子程序accept負載均衡問題?

reuseport是核心一級的負載均衡,不用 Nginx 自己 worker 相互爭搶鎖了。但這個特性需要在 Linux 3.9+ 核心上才有。

對老版本的核心或不支援類似特性的系統,Nginx 還得保留老在鎖機制。

開啟reuseport還可能遇到乙個坑。就是你改了 Nginx 的配置,然後不小心又起了一組新的 Nginx 程序。那你完了。

你會發現新配置一會生效,一會不生效。如果沒有經驗話,浪費你乙個下午那是你運氣好。

2樓:old4

3樓:李自樂

多執行緒處理同一埠而不會產生太嚴重競爭可參見谷歌 how to receive 100w packets per second(傳送門待會兒補)

4樓:凡柯

我來回答一下自己的問題,拋磚引玉吧

先描述下Nginx的網路模型

1 nginx的master程序建立一系列的監聽套接字(比如需要監聽不同的埠,80,443等),下面都以監聽80埠為例來說明。

2 fork出多個worker程序,這些worker程序繼承了監聽套接字。

5 Nginx的驚群解決手段: 如果有多個worker程序,且開啟了accept_mutux 鎖(預設開啟)

這時候每個worker不會將監聽套接字加入到自己的epoll中,而是會去搶一把自旋鎖,即對監聽套接字「權力」,搶到的worker程序會將監聽套接字加入自己的epoll中,accept新請求,然後釋放鎖。

所以,如果沒有這種強鎖機制,每個worker的epoll中都會監視監聽套接字,這樣每次請求到來時,每個worker都會被喚醒,而最終accept這個請求的只能有乙個,其它的worker的喚醒是浪費的。

應該說在低併發情況下,這種處理機制會很好地提公升cpu效率。

現在很多例項證明:在併發很高的情況下,nginx這種處理驚群的機制會導致處理效率的下降,所以現在很多建議是關閉accept_mutux鎖,這樣每個worker中的epoll中都會監視監聽套接字。

幸運的是,從nginx的高版本開始,這個鎖預設是已經關閉的了。

為什麼在高併發的情況下,關閉鎖導致使驚群現象產生,也會提公升效能呢?網上有個很形象的例子,這裡我借用下:

試想,有一群雞(是真正的雞),你撒穀粒給這群雞吃。

a,一粒粒撒的時候,如果不加處理,每個雞都會跳起來,但最終只有乙隻雞能夠吃到這粒公尺,

所以在一粒粒撒的時候,需要有鎖,不能讓每個雞都跳起來,這樣浪費它們的精力,必須要讓它們遵守秩序,乙個個來(加鎖)

b,然而,如果你撒了一大把穀粒,這時候還讓它們乙個個來,豈不是很不合理,所以,在撒大把穀粒的情況下,這些雞全部跳起來搶食才是科學的,這樣才能更加快速地消耗掉這些穀粒。(不加鎖)。

上面的例子雖然有些粗糙,但是很形象。

6 回到我們的話題SO_REUSEPORT這個選項,官方在nginx.19.1中支援這個,且經過測試,開啟這個選項,會使得的nginx的效能提公升3倍。

具體測試可見:Socket Sharding in NGINX OSS Release 1.9.

1他們比較了三種情況,常規情況(開啟鎖),關閉鎖,和開啟SO_REUSEPORT。

對於關閉鎖比開啟鎖提公升效能,這個好理解。

7 下面解釋開啟reuseport後,nginx的表現是如何的:

先解釋下reuseport的意思:核心支援同乙個埠可以有多個socket同時進行監聽而不報錯誤。

nginx是這樣利用這個特徵的:master在啟動階段,根據配置的worker的資料n,針對同乙個listen埠,比如80,建立了n個socket,然後同時bind到80埠。

在進行fork worker時,此時的場景如下所示:

然後,每個worker會根據自己的id號,將和自己id相對應的sockfd加入自己的epoll中:如下:

這樣就達到了每個worker都有「自己「的socketfd在epoll中,而不用和其他worker進行」共享「而造成驚群。

其實,在reuseport場景下,相當於把負載均衡的步驟下放到核心來做了:

核心會均衡地把同乙個埠上的連線,均衡地分發到監聽這個埠的socket上。

至此,reuseport分析完畢。

5樓:余雷宇

nginx主要用在服務重啟避免報埠已被占用錯誤。之前重啟時在某些有連線還沒釋放的情況,這樣新啟動的進城會報錯,埠被占用,所以在Linux核心支援這個選擇項後,nginx就在新版支援了。

PS:跟多個worker同時監控乙個埠關係不大。

6樓:靈劍

這個我剛好知道,這是Linux核心新支援得乙個TCP選項,這樣不需要fork也可以在不同程序中監聽同個埠,對nginx來說有什麼用我就不清楚了,也的確想不出什麼實際的例子……對其他應用來說,可以不需要實現fork-server就能支援多程序模式了。

能想到的就是在需要服務重啟的時候,可以先把新的例項啟動起來,再退出舊例項,保證服務不中斷?但是這個以前也只要通過某種方式通知舊的例項停止listen就行了。

我最近在搞大事

牙都長好了 現在的結婚觀念大多都是男的要有房有車,所以做父母的總擔心自己的孩子因為這個而結不了婚什麼的,然後就會想辦法幫他們買房買車,即使家境很一般。你父母大概也是這樣,然後想著你都工作了也可以幫家裡減輕點負擔,覺得你以後嫁個有錢人就好了,但是他們也沒問過你的感受。我不懂為什麼你板著臉就要罵你,我回...

竇文濤最近在幹什麼?

小小腚錘子 看最近的鏘鏘行天下,再結合以前他在節目裡談到的一些他的生活狀態,我感覺老竇平時基本除了錄節目 製作節目和準備節目素材,其他時間大部分就是深居簡出,喜歡乙個人在家裡呆著,看書看看材料,看紀錄片看電影還有歷史節目和一些美劇之類的 以前他有在節目裡談到過 他其實很享受乙個人的生活和寧靜,好像也...

大家最近在看什麼劇啊?

車車的地下冷藏庫 想見你。這一部劇真的太上頭了!看得很過癮。除了有甜甜愛情在裡面還有懸疑的部分,非常有劇情,而且會有一直看下去的衝動。並且結局也是特別的完美。這是我目前為止看到一部最好的劇,不僅僅劇情方面,還有人設各種的都特別的鮮明,而且結局也是我想要的,以前看劇每次到結局都是有遺憾存在的,而這一部...