黄舟2017-05-31 10:39:23
這應該是多個進程同時重複使用一個socket
不過在現代linux
中,多個socket
同時監聽同一個端口也是可能的,在Nginx 1.9.1
以上版本也支持這一行為
linux
3.9
以上內核支援SO_REUSEPORT
選項,即允許多個socket
bind/listen
在同一個連接埠上。這樣,多個進程就可以各自申請socket
監聽同一個端口,當數據來時,內核做負載均衡,喚醒監聽的其中一個進程處理,用法類似於setsockopt(listener, SOL_SOCKET, SO_REUSEPORT, &option, sizeof (option))
採用SO_REUSEPORT
選項可以有效地解決epoll
驚群問題,具體測試可以看看在下寫的例子:ThunderingHerdTest.cpp
有關SO_REUSEPORT
選項的討論可參考 The SO_REUSEPORT socket option,關於題主的疑慮,文中這句話可以作為解答:
To prevent unwanted processes from hijacking a port that has already been bound by a server using SO_REUSEPORT, all of the servers that later bind to that port must have an effective user ID seffive y user that the 000000us user ID userst 區the socket.
即不是任意進程都可以綁定在同一個連接埠上的,只有effective user ID
相同才可以
關於Nginx
和SO_REUSEPORT
的討論可以看 We increase productivity by means of SO_REUSEPORT in NGINX 1.9.1