动态

详情 返回 返回

reuseport與驚羣效應 - 动态 详情

SO_REUSEADDR vs SO_REUSEPORT

BSD

SO_REUSEADDR

效果1:
0.0.0.0:21127.0.0.1:21可以同時綁定

效果2:
對於TCP連接,綁定到某個特定IP+port時,可以忽略其time_wait狀態

注意:該選項只對調用bind()的新套接字有效,與正在佔用地址的套接字是否使用了該選項無關。

SO_REUSEPORT

效果:允許多個套接字綁定到相同的IP+port

注意:必須前一個套接字也設置了該選項才行。

對於組播,這兩個選項的作用是一樣的。

Linux

Linux < 3.9

沒有SO_REUSEPORT選項。

注意:

  1. 如果有TCP套接字綁定了0.0.0.0:21並處於監聽狀態,就不能再綁定127.0.0.1:21
  2. reuseaddr與reuseport的作用相似,如果前一個套接字設置了SO_REUSEADDR,後面的套接字也設置這個選項就可以綁定相同的地址和端口

Linux >= 3.9

引入了SO_REUSEPORT

特殊效果:可實現負載均衡

注意:前後兩個套接字所屬進程必須有相同的有效UID。

Nginx驚羣效應

驚羣效應

父進程創建套接字,綁定並監聽;所有子進程accept,然後epoll。此時新連接到來,所有子進程均被喚醒,造成不必要競爭,稱為驚羣效應。

解決方法

accept_mutex

所有子進程在accpet之前先取accept_mutex,成功取到鎖的才會調用accept。實質上是把驚羣推遲到空閒時間,在新連接到來時不發生驚羣,提升新連接響應速度。

reuseport

Linux >= 3.9

父進程不創建套接字,每個子進程各自創建自己的,綁定到相同地址並監聽。新連接到來時,內核將連接請求交付到某一個套接字上,從而避免了驚羣。

EPOLLEXCLUSIVE

Linux >= 4.5 && nginx >= 1.11.3

epoll支持EPOLLEXCLUSIVE選項,如果有多個進程監聽同一個套接字,則epoll只喚醒其中一個進程,也從根源上避免了驚羣。

參考資料

https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ

user avatar zhengzhouaiwenkeji 头像 wangtian_65f943469b2c3 头像 labilezhu 头像 feichangkudechongfengyi 头像
点赞 4 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.