确定nginx反向代理负载限制

我有一个nginx服务器(CentOS 5.3,linux),我用它作为8个Ruby on Rails应用程序服务器前面的反向代理负载平衡器。 随着我们在这些服务器上的负载增加,我开始怀疑nginx服务器会成为什么瓶颈? CPU很难使用,但这是可以预料的。 记忆似乎很好。 没有可说的IO。

那么,我在网卡上唯一的限制带宽? 目前,根据一些仙人掌图,在高负载的情况下,服务器在每个网卡上的打击率约为700Kbps(平均5分钟)。 我认为这还是很低的。

或者,是否将限制在操作系统的套接字或其他资源?

感谢您的任何想法和见解。

编辑:
racyclist:

感谢您的见解。 我做了更多的挖掘。 我有1个工人允许1024个worker_connections。 假设95%的请求是针对less量数据的。 有什么build议512MB系统应该能够处理,连接明智吗?

另外,统计连接的好方法是什么? 会这样的事情是准确的吗?

netstat -np | grep ESTABLISHED | grep nginx | wc -l 

结束编辑

亚伦

目前,根据带宽利用情况,你有相当低的负载。 有很多可能的瓶颈,仅举几例:

networking相关

随着连接数量的增长,您可以点击Nginx工作进程的worker_connections限制。 这个说唱家的描述相当不错,我只是给它添加几分钱。 实际上你拥有的工人越多,就越有可能击中某个工人的工人。 其原因是Nginx主进程不能保证工作者之间的连接的均匀分配 – 有些可以比别人更快地处理请求,因此最终可以超出限制。

我的build议是尽可能less的工人与大量的工人worker_connections 。 但是如果你有IO的话,你将不得不增加工人的数量(见下文)。 使用nginx的status模块来监视它使用的套接字数量。

你可能会碰到操作系统(Linux或FreeBSD)限制每个进程打开文件描述符的数量。 Nginx将使用描述符不仅用于传入请求,而且用于传出连接到后端。 最初这个限制被设置为非常低的值(例如1024)。 Nginx会在这个事件的error.log抱怨。

如果您使用的是iptables及其conntrack模块(Linux),那么您也应该超过conntrack表的大小。 注意dmesg/var/log/messages 。 根据需要增加此限制。

一些非常好的优化应用程序利用100%的带宽。 我敢打赌,你以前会遇到以前的问题。

IO相关

实际上,一个Nginx的工作者在IO上阻塞。 因此,如果您的网站正在提供静态内容,则需要增加Nginx工作人员的数量来解决IO阻塞问题。 在这里很难提供食谱,因为它们根据文件的数量和大小,负载types,可用内存等而变化很大。

如果您通过Nginx代理到某个后端的连接,则应该考虑到它会创build临时文件来存储后端的答案,而在高stream量的情况下,这可能会导致文件系统上的大量负载。 注意Nginx的error.log消息,并相应地调整proxy_buffers (或fastcgi_buffers )。

如果你有一些背景IO(例如MySQL),它也会影响静态文件。 注意IO等待%

它不仅仅是一个网卡的带宽。 Nginx具有可以处理的最大连接数。 最大连接数可以通过一个简单的公式来计算:“worker_processes”*“worker_connections”。 瓶颈将取决于您的应用程序。 如果你有很多使用低带宽的连接,那么在填充你的pipe道之前,你更可能会用尽连接。 相反,使用大量带宽的less量连接可能会填满您的pipe道,而无法达到最大连接数量。

关于开放连接。 跟踪它们的最好方法是检查/ proc / net / ip_conntrack。

 cat /proc/net/ip_conntrack | egrep 'dport=(80|443)'| wc -l 

现在,关于你的nginx问题,没有真正的答案。 您只需要对您的设置进行基准testing(使用像httperf这样的工具),看看您可以处理的负载是多less。