最大化Nginx请求/秒的提示?


15

我正在构建一个分析程序包,并且项目要求指出我每天需要支持10亿次匹配。是的,“十亿”。换句话说,每秒持续命中不少于12,000次,最好有一定的爆发空间。我知道我将需要多个服务器,但是我试图在“向其添加更多硬件”之前从每个节点中获得最大性能。

现在,我已经完成了点击跟踪部分,并对其进行了优化。我几乎只是将请求直接保存到Redis中(供以后使用Hadoop处理)。该应用程序是Python / Django,带有用于网关的粗话。

我的2GB Ubuntu 10.04 Rackspace服务器(不是生产机器)每秒可以处理约1200个静态文件(使用Apache AB标记为一个静态资产)。相比之下,如果我将静态文件链接替换为跟踪链接,则每秒仍会收到约600个请求-我认为这意味着我的跟踪器已经过优化,因为它仅比提供相同的静态资产慢2倍反复。

但是,当我以数以百万计的点击数作为基准时,我注意到一些事情-

  1. 没有磁盘使用-这是预料之中的,因为我已经关闭了所有Nginx日志,并且我的自定义代码除了将请求详细信息保存到Redis之外不执行任何操作。
  2. 非恒定内存使用率-大概是由于Redis的内存管理,我的内存使用率将逐渐上升然后回落,但是这从来都不是我的瓶颈。
  3. 系统负载徘徊在2-4左右,即使在我最重的基准测试期间,系统仍然可以响应,并且我的(其他)服务器每执行600个请求时,我仍然可以手动查看http://mysite.com/tracking/pixel,几乎看不到延迟。第二。
  4. 如果我进行了一次简短的测试,比如说50,000次点击(大约200万次),那么我每秒就会收到600个稳定可靠的请求。如果我运行更长的测试(到目前为止尝试了3.5m),我的r / s会降低到250。

我的问题-

一种。看起来我要用尽这台服务器了吗?1200个/ s静态文件的nginx性能是否可与其他人媲美?

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

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

d。在长时间运行的测试中,什么会导致我的性能下降到250r / s?同样,在这些测试过程中内存没有达到极限,并且HDD的使用为零。

在此先感谢,所有:)

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


您在一篇文章中提出了多个问题,请考虑修改。我只是发表评论而不是回答,因为我无法回答所有部分。我认为您已经考虑过Python / Django的性能-这对于极端速度而言并不理想。关于1200 req / s,对于我假设是1px gif或HTTP 204响应,这听起来非常低。参见fx simonhf.wordpress.com/2010/10/02/nginx-versus-sxe-hello-world(24k req / s,在本地主机上运行,​​但仅使用1个nginx worker。)
Jesper M,

金矿评论,非常感谢。我将通读该帖子,并返回我的发现;感谢您的“多个问题”指针!
链接链接

Answers:


8

您正在滥用Nginx的worker_threads。绝对没有必要雇用那么多工人。您应该像运行CPU那样运行尽可能多的工作器,并每天调用它。如果您在同一台服务器上运行gunicorn,则可能应将nginx worker限制为两个。否则,您将通过管理所有这些进程所需的所有上下文切换来击败CPU。


1
嗯谢谢 64的性能似乎与2的性能大致相同,但我知道WTF并没有这样做。感谢您的澄清。
链接链接

您可以共享您的Nginx配置吗?当我们不知道要调整的内容时,很难提供调整技巧。
blueben

2

我已经使用nginx服务5K请求静态内容。您可以增加当前设置为1024的worker_connections的数量。

max_client计算如下。

主要部分的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. 我建议您尝试对设置进行基准测试,以便为您提供最实际的数字。您可以使用siege,pummel,apache bench等工具,切记在测试过程中测量系统资源的使用情况。

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

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

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


应该如何确定您是否可以增加worker_connections,以及对于给定服务器而言理想的设置是什么?
加藤

有两种方法可以解决此问题。
Sameer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.