译:Socket Sharding in NGINX Release 1.9.1
说明:没有完全翻译,挑重要的内容选译的。
NGINX 1.9.1引入了一个新特性,能够使用SO_REUSEPORT套接口选项。SO_REUSEPORT在许多操作系中如DragonFly BSD和Linux(内核3.9以上)是可用的。
这个套接口选项,允许多个套接口监听相同ip:port绑定。由内核通过sockets负载均衡传入的连接。
SO_REUSEPORT套接口选项,有许多实用潜力。其它服务可以很容易地实现rolling upgrades(NGINX已经能够通过多种方法支持rolling upgrades)。对于NGINX而言,开启这个特性在许多场景中都能带来性能提升。
如果SO_REUSEPORT选项没有开启,则由一个套接口监听多个传入连接所代表的workers。当SO_REUSEPORT开启时,会有多个socket listeners处理各自的ip:port,这样内核负载均衡给socket listener,socker listener转给自己的worker。
由内核决定哪个sockerlistener能获得,可以有效减少锁竞争,提高多核电脑的性能。
然而这也意味着,当一个worker因执行阻塞操作而停顿时,不仅会影响该worker已经接受的连接,还会影响到内核自阻塞以来,内核已经分配给该worker的连接请求。
套接口拆分的配置
配置SO_REUSEPORT,包括HTTP和TCP监听的reuseport参数。
http {
server {
listen 80 reuseport;
server_name localhost;
# ...
}
}
stream {
server {
listen 12345 reuseport;
# ...
}
}
reuseport参数会禁用套接口的accept_mutex指令。因为对于reuseport来说锁是多余的。如果没有设置reuseport,设置accept_mutex仍是值得的。
https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/