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

lin*_*ked 16 nginx scaling high-volume redis

我正在构建一个分析包,项目要求指出我每天需要支持 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 次点击(大约需要 2m),我会得到稳定、可靠的每秒 600 个请求。如果我运行更长的测试(到目前为止尝试了 3.5m),我的 r/s 会降到大约 250。

我的问题——

一种。看起来我已经把这台服务器最大化了吗?1,200/s 静态文件 nginx 性能与其他人经历过的性能相当吗?

湾 对于此类大容量应用程序,是否有常见的 nginx 调优?我将工作线程设置为 64,将 gunicorn 工作线程设置为 8,但调整这些值似乎对我没有多大帮助或伤害。

C。是否有任何 linux 级别的设置可能会限制我的传入连接?

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

提前致谢,所有:)

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

blu*_*ben 8

你在滥用 Nginx 的 worker_threads。绝对没有必要运行那么多工人。您应该运行与 CPU 一样多的工作程序,并称其为一天。如果您在同一台服务器上运行 gunicorn,您可能应该将 nginx worker 限制为两个。否则,您只需要用管理所有这些进程所需的所有上下文切换来处理 CPU。