Nginx worker_connections的最佳值

Nginx worker_connections “设置工作进程可以打开的同时连接的最大数量,这个数字包括所有的连接(例如与代理服务器的连接等),而不仅仅是连接到客户端,另一个考虑因素是实际同时连接的数量连接不能超过最大打开文件数的限制“。 我对此有几点疑问:

  1. 什么应该是最佳或推荐值呢?
  2. 使用大量工人连接有什么缺点?

让我们采取务实的态度。

所有这些限制都是在上个世纪硬件缓慢和昂贵时被硬编码和devise的。 我们现在在2016年,一个普通的沃尔玛烤面包机可以处理比默认值更多的请求。

默认设置实际上是危险的。 在一个网站上有数百个用户并不令人印象深刻。

worker_process

一个相关的设置,让我们来解释,而我们在这个话题上。

nginx作为负载均衡器:

  • 1个负载均衡工作者。
  • 每个核心1个工作人员进行HTTPS负载平衡。

nginx作为networking服务器:

这一个是棘手的。

一些应用程序/框架/中间件(例如php-fpm)在nginx之外运行。 在这种情况下,1个nginx工作者就足够了,因为通常是外部应用程序正在进行繁重的处理和资源消耗。

而且,一些应用程序/框架/中间件一次只能处理一个请求,并且会导致超载。

一般来说,1名工人总是一个安全的赌注。

否则,如果你知道自己在做什么,你可以为每个核心部署一名工人。 我认为这条路线是一个优化,并build议适当的基准和testing。

worker_connections

连接的总数是worker_process * worker_connections 。 一半在负载平衡器模式。

现在我们正在达到烤面包机的一部分。 有很多严重低估的系统限制:

  • ulimits是每个进程在Linux上1k max打开文件(1k软,4k在某些发行版上很难)
  • 系统限制与ulimits大致相同。
  • nginx默认是每个worker有512个连接。
  • 可能还有更多:SELinux,sysctl,supervisord(每个发行版+版本稍有不同)

1k worker_connections

安全的默认设置是把1k放到任何地方。

这足以胜过大多数内部和未知的网站。 这足够低,不会触及任何其他系统限制。

10k worker_connections

有成千上万的客户,特别是公共网站是非常普遍的。 我停止计算我看到的网站数量下降,因为默认值较低。

生产可接受的最小值为10k。 必须增加相关的系统限制以允许它。

没有太高的限制(如果没有用户,限制根本不起作用)。 然而,太低的限制是一个非常真实的事情,导致被拒绝的用户和死亡的网站。

超过10K

10k很好,很容易。

我们可以设置一个任意1000kk的限制(毕竟它只是一个限制),但是没有什么实际意义,我们从来没有得到这个stream量,也无法承受。

让我们坚持10K作为一个合理的设置。 要实现(而且确实可以)更多的服务需要特殊的调整和基准testing。

特殊情况:高级使用

有时候,我们知道服务器没有太多的资源,我们预计我们不能做太多的事情。 我们宁可拒绝用户,也不要尝试。 在这种情况下,把合理的连接限制,并configuration好的错误信息和处理。

有时,后端服务器运行良好,但只能承受一些负载 ,更重要的是,一切都快速南下。 我们宁愿放慢比服务器崩溃。 在这种情况下,configuration严格的限制排队,让nginx缓冲所有的热量,同时请求以最快的速度排出。

通过testing可以发现合适的大小,因为它是基于Nginx正在处理的stream量types而变化的。

理论上,nginx可以处理:max clients = worker_processes * worker_connections(* = multiply)和worker_processes =处理器数量

要找出处理器,请使用:grep processor / proc / cpuinfo | wc -l

如果资源有限,设置下限可能会有用。 一些连接,例如保持连接(不仅与客户端,而且与上游服务器连接 ),实际上是浪费你的资源(即使nginx是非常有效的,它是),并不是必需的通用服务器的正确操作,意味着它们可以被安全地丢弃,从而为剩下的操作提供更多的资源。

因此,具有较低的资源限制将向nginx指示您可能在物理资源上是低的,并且那些可用的应该被分配给新的连接,而不是以更新的连接为代价来服务于闲置的保持连接的连接,满足更迫切的需求。

什么是推荐值? 这是默认的。

默认值全部logging在文档中:

默认值:worker_connections 512;

并且可以在event/ngx_event.c的源代码级别进行确认

13#定义DEFAULT_CONNECTIONS 512

ulimit -a会告诉你系统允许一个进程使用多less个打开的文件。

而且, net.ipv4.ip_local_port_range设置每个IP启用的套接字的总范围。

因此,您的worker_connections不能超过其中的任何一个,否则您的客户端连接将排队,直到net.core.netdev_max_backlog – TCP队列的总大小。

请记住,如果您使用nginx作为反向代理,则每个连接使用两个套接字。 你可能想用net.ipv4.tcp_fin_timeout和其他与内核tcp有关的超时来尝试快速切换套接字状态。 另外需要注意的是,每个socket分配TCP内存堆栈的内存,也可以使用sysctl设置TCP内存堆栈的一些限制,只要你有CPU和足够的文件处理程序,就可以在RAM中施加更多的压力。

仅供参考,可以给予足够的计算资源,使用一个大约32GB内存的服务器和一些虚拟networking接口来处理1MM的同时连接,并使用sysctl进行一些内核调整。 在我的testing中,当处理超过1MM并发送大约700Bytes的有效载荷时,服务器花费了大约10秒来更新大约1.2MM的同时客户端。 接下来是通过绑定一些额外的网卡和开通虚拟网卡来增加networking带宽。 考虑到有效载荷,带宽和更新所有客户端的合理时间,有可能实现与超过1.2MM客户端的伪近实时通信。

快乐调教!