2

我们有一个流行的 iPhone 应用程序,人们可以在其中像 Wordfeud 一样互相决斗。我们今天有近 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 中的超时与独角兽中的超时,以查看问题出在哪里?

4

2 回答 2

5

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

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

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

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

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

更新:

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

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

于 2012-11-22T09:18:09.397 回答
0

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

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

在 nginx 版本 1.2.2 之后,nginx 提供了这个least_conn. 这可能是一个简单的解决方法。我自己还没有尝试过。

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

于 2013-04-05T11:49:55.600 回答