繁体   English   中英

Nginx瓶颈成为负载均衡器?

[英]Nginx bottleneck as load balancer?

我们有一个受欢迎的iPhone应用程序,人们可以在其中相互对战。 今天我们有近100万注册用户。

在高峰时段,该应用程序的响应时间非常长,而且还有很多超时时间。 我们试图找到瓶颈,但是很难做到这一点。 所有服务器上的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错误日志中显示的所有超时。

我们还尝试直接在前端服务器上构建和运行该应用程序(在高峰时段,当所有其他用户都在负载平衡器上运行时)。 令人惊讶的是,即使在高峰时段,绕过负载平衡器的应用程序也能像子弹般快速运行。

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中的超时与独角兽中的超时进行比较,以查看问题所在?

根据您的设置,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读取和写入缓冲区(在Linux上为sysctl -w net.ipv4.tcp_rmem="4096 4096 16777216"sysctl - net.ipv4.tcp_wmem="4096 4096 16777216"
  3. 本地端口范围(在Linux上为sysctl -w net.ipv4.ip_local_port_range="1024 65536"

更新:

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

允许并发用户略超过16,000,这足以满足您的峰值需求吗?

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

很难想象Nginx本身就是瓶颈。 某些上游应用服务器受到的打击可能比其他服务器严重得多,并由于积压已满而开始拒绝连接吗? 在Heroku上查看此负载平衡问题,然后查看是否可以在此处获得更多帮助。

在nginx版本1.2.2之后,nginx提供此least_conn 那可能很容易解决。 我还没有尝试过。

指定组应使用负载平衡方法,其中将请求传递到活动连接数最少的服务器,同时考虑服务器的权重。 如果有多个这样的服务器,则使用加权循环平衡方法尝试它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM