译:Socket Sharding in NGINX Release 1.9.1

译: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/

你可能感兴趣的:(译:Socket Sharding in NGINX Release 1.9.1)