Nginx作为负载均衡器的瓶颈?

我们有一个stream行的iPhone应用程序,人们对决一个Wordfeud。 我们今天有近1 M的注册用户。

在高峰时段,应用获得了非常长的响应时间,而且还有相当多的超时时间。 我们试图find瓶颈,但是很难做到这一点。 所有服务器上的CPU,内存和I / O都低于50%。 这个问题只在高峰期出现。

我们的设置

1 VPS with nginx (1.1.9) as load balancer 4 front servers with Ruby (1.9.3p194) on Rails (3.2.5) / Unicorn (4.3.1) 1 database server with PostgreSQL 9.1.5 

数据库日志没有显示足够长的请求时间来解释nginx错误日志中显示的所有超时。

我们还试图直接针对前台服务器构build和运行应用程序(在所有其他用户都在运行负载平衡器的高峰时段)。 令人惊讶的是,即使在高峰时段,绕过负载平衡器的应用程序也很快成为子弹。

NGINX设置

 worker_processes=16 worker_connections=4096 multi_accept=on 

LINUX设置

 fs.file-max=13184484 net.ipv4.tcp_rmem="4096 87380 4194304" net.ipv4.tcp_wmem="4096 16384 4194304" net.ipv4.ip_local_port_range="32768 61000" 

为什么应用程序绕过负载平衡器这么快? nginx可以作为负载均衡器成为瓶颈吗? 有什么好的方法来比较nginx中的超时和超时在独angular兽看问题的地方?

根据你的设置,nginx可能是瓶颈

在nginx中检查/调整以下设置:

  1. worker_processes设置(应该等于核心数/ cpus)
  2. worker_connections设置(如果在高峰期有很多连接,则应该是非常高的)
  3. 设置multi_accept on;
  4. 如果在Linux上,在nginx中确保你使用epoll( use epoll; -directive)

检查/调整您的操作系统的以下设置:

  1. 允许打开的文件描述符的数量(在Linux上, sysctl -w fs.file-max=999999
  2. tcp读写缓冲区( sysctl -w net.ipv4.tcp_rmem="4096 4096 16777216"sysctl - net.ipv4.tcp_wmem="4096 4096 16777216" on linux)
  3. 本地端口范围(在Linux上为sysctl -w net.ipv4.ip_local_port_range="1024 65536"

更新:

  • 所以你每个工人有16个工人和4096个连接
  • 这意味着最多4096 * 16 = 65536个并发连接
  • 你可能每个浏览器有多个请求(ajax,css,js,页面本身,页面上的任何图像,…),假设每个浏览器有4个请求

允许稍微超过16k个并发用户,这足以满足您的高峰了吗?

如何设置上游服务器组,以及您使用的负载均衡方法是什么?

很难想象Nginx本身就是瓶颈。 有些上游应用程序服务器可能比其他上游应用程序服务器受到更多打击,并且由于积压已满而开始拒绝连接? 在Heroku上查看这个负载平衡问题 ,看看你能否在这里获得更多的帮助。

在nginx 1.2.2之后,nginx提供了这个least_conn 。 这可能是一个简单的解决办法。 我还没有尝试过呢。

指定一个组应该使用负载均衡方法,其中请求被传递给活动连接数最少的服务器,同时考虑到服务器的权重。 如果有几个这样的服务器,他们尝试使用加权轮循平衡方法。