最大化 Nginx 请求数/秒的技巧?

最大化 Nginx 请求数/秒的技巧?

我正在构建一个分析包,项目要求我需要支持每天 10 亿次点击。没错,“十亿”。换句话说,每秒持续点击量不低于 12,000 次,最好有一定的爆发空间。我知道我需要多台服务器来实现这一点,但我试图在“投入更多硬件”之前让每个节点发挥出最大性能。

现在,我已经完成了命中跟踪部分,并进行了很好的优化。我基本上只是将请求直接保存到 Redis 中(以便稍后使用 Hadoop 进行处理)。该应用程序是 Python/Django,网关为 gunicorn。

我的 2GB Ubuntu 10.04 Rackspace 服务器(不是生产机器)每秒可以提供大约 1200 个静态文件(使用 Apache AB 针对单个静态资产进行基准测试)。相比之下,如果我将静态文件链接换成跟踪链接,我每秒仍会收到大约 600 个请求——我认为这意味着我的跟踪器经过了很好的优化,因为它仅比重复提供相同的静态资产慢 2 倍。

然而,当我对数百万次点击进行基准测试时,我注意到了一些事情——

  1. 没有磁盘使用量——这是预料之中的,因为我已经关闭了所有 Nginx 日志,并且我的自定义代码除了将请求详细信息保存到 Redis 中之外不执行任何操作。
  2. 内存使用不稳定——大概是因为 Redis 的内存管理,我的内存使用量会逐渐上升然后回落,但这从来都不是瓶颈。
  3. 系统负载徘徊在 2-4 左右,即使在我最繁重的基准测试中,系统仍然响应迅速,我仍然可以手动查看http://mysite.com/tracking/pixel几乎没有明显的延迟,而我的(其他)服务器每秒执行 600 个请求。
  4. 如果我进行一次简短的测试,比如 50,000 次点击(大约需要 2 分钟),我每秒可以稳定、可靠地获得 600 个请求。如果我进行一次较长的测试(到目前为止已尝试了 3.5 分钟),我的 r/s 会下降到大约 250。

我的问题是——

a. 看起来我已经将这台服务器的容量最大化了吗? 1,200/s 静态文件 nginx 的性能与其他人体验的相比如何?

b. 是否有针对此类高容量应用程序的常见 nginx 调优方法?我将工作线程设置为 64,将 gunicorn 工作线程设置为 8,但调整这些值似乎对我没什么帮助或伤害。

c. 是否有任何 Linux 级别的设置可以限制我的传入连接?

d. 什么原因会导致我的性能在长时间运行的测试中下降到 250r/s?同样,在这些测试中内存没有达到最大值,并且硬盘使用率为零。

提前感谢大家:)

编辑 这是我的 nginx 配置——http://pastie.org/1450749—— 它主要是香草味,明显的去掉了脂肪。

答案1

您正在滥用 Nginx 的 worker_threads。绝对没有必要运行那么多 worker。您应该运行与 CPU 数量相同的 worker,然后就结束了。如果您在同一台服务器上运行 gunicorn,则可能应该将 nginx worker 限制为两个。否则,您只会因为管理所有这些进程所需的所有上下文切换而浪费 CPU。

答案2

我使用 nginx 每秒处理 5K 个静态内容请求。您可以增加当前设置为 1024 的 worker_connections 数量。

max_client 计算如下。

主要部分中的 worker_connections 和 worker_proceses 允许您计算 maxclients 值:

最大客户端数 = worker_processes * worker_connections

在反向代理情况下,max_clients 变为

最大客户端数 = worker_processes * worker_connections/4

http://wiki.nginx.org/EventsModule#worker_connections

一旦知道了设置的容量,计算最大工作连接数就很容易了。总容量/核心数就是最大工作连接数。计算总容量有多种方法。

  1. 我建议你尝试对设置进行基准测试,这样才能得到最真实的数字。你可以使用 siege、pummel、apache bench 等工具,但一定要记得在测试期间测量系统资源使用情况。

如果上述方法对您不起作用,请尝试以下方法。我做了广泛的假设,忽略了 RAM 和 IO,它们也会被考虑进去,但这些将为您提供起点,您可以从那里进行调整。

  1. 假设带宽是瓶颈,取 nginx 服务的平均对象大小并用您的带宽除以该大小,您将获得支持的最大 qps。

  2. 在第二个假设中,CPU 是瓶颈。在这种情况下,测量请求时间然后用 1 除以它,再乘以系统的核心数。这将得出 nginx 每秒可以处理的请求数。

相关内容