提高Nginx请求/秒的技巧?

我正在构build一个分析包,项目需求说明我需要每天支持10亿次点击。 是的,“十亿” 换句话说,每秒不less于12000次点击持续,最好是有一定的破解空间。 我知道我需要多个服务器,但是我试图在“抛出更多的硬件”之前,在每个节点上获得最大的性能。

目前,我已经完成了点击跟踪部分,并进行了优化。 我几乎只是将请求直接保存到Redis中(以便以后使用Hadoop进行处理)。 该应用程序是Python / Django与网关gunicorn。

我的2GB Ubuntu 10.04 Rackspace服务器(不是生产机器)每秒可以处理大约1200个静态文件(使用Apache AB针对单个静态资产进行基准testing)。 为了比较,如果我用我的跟踪链接换出静态文件链接,我仍然每秒获得约600个请求 – 我认为这意味着我的跟踪器已经优化,因为它只比服务相同的静态资产慢2倍反复。

然而,当我以数百万次的点击为基准时,我注意到了一些事情 –

  1. 没有使用磁盘 – 这是预料之中的,因为我已经closures了所有的Nginx日志,而且我的自定义代码除了将请求详细信息保存到Redis之外什么也不做。
  2. 非固定的内存使用情况 – 据推测,由于Redis的内存pipe理,我的内存使用量将逐渐攀升,然后又回落,但从来没有成为我的瓶颈。
  3. 系统负载徘徊在2-4左右,甚至在我最重要的基准testing中,系统仍然响应,而且我仍然可以手动查看http://mysite.com/tracking/pixel ,但是我的(其他)服务器每次执行600次请求第二。
  4. 如果我进行一个简短的testing,比如说5万次点击(大概需要2米),那么我每秒钟可以获得稳定,可靠的600个请求。 如果我运行一个更长的testing(到目前为止尝试高达3.5米),我的r / s降低到大约250。

我的问题 –

一个。 它看起来像我最大的这台服务器呢? Nginx的性能堪比其他人所经历的1200 / s静态文件?

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

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

d。 什么可能导致我的性能在长时间运行的testing中降低到250r / s? 同样,在这些testing中,内存不是最大的,硬盘使用率是零。

在此先感谢,所有:)

编辑这里是我的nginxconfiguration – http://pastie.org/1450749 – 它主要是香草,脂肪明显削减。

    你滥用Nginx的worker_threads。 绝对没有必要运行这么多的工人。 你应该运行尽可能多的工人,因为你有CPU,并且每天都这么叫。 如果你在同一个服务器上运行gunicorn,你应该把nginx的工作者限制在两个。 否则,你只需要用所有的上下文切换来pipe理所有这些进程。

    我用nginx为静态内容提供了5K秒的请求。 您可以增加当前设置为1024的worker_connections的数量。

    max_client计算如下。

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

    max_clients = worker_processes * worker_connections

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

    max_clients = worker_processes * worker_connections / 4

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

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

    1. 我build议你尝试基准你的设置,这将给你最现实的数字。 你可以使用围攻,拳击,阿帕奇等工具,记得在testing过程中测量系统资源的使用情况。

    如果你以上的方法不适合你,然后尝试下面的方法。 我正在做广泛的假设,忽略内存和IO,他们也将考虑因素,但这些会给你起点,你可以从那里进行调整。

    1. 假设带宽是瓶颈,取nginx正在服务的平均对象大小,并用你的带宽来分割,你将得到最大支持的qps。

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