我正在构build一个分析包,项目需求说明我需要每天支持10亿次点击。 是的,“十亿” 换句话说,每秒不less于12000次点击持续,最好是有一定的破解空间。 我知道我需要多个服务器,但是我试图在“抛出更多的硬件”之前,在每个节点上获得最大的性能。
目前,我已经完成了点击跟踪部分,并进行了优化。 我几乎只是将请求直接保存到Redis中(以便以后使用Hadoop进行处理)。 该应用程序是Python / Django与网关gunicorn。
我的2GB Ubuntu 10.04 Rackspace服务器(不是生产机器)每秒可以处理大约1200个静态文件(使用Apache AB针对单个静态资产进行基准testing)。 为了比较,如果我用我的跟踪链接换出静态文件链接,我仍然每秒获得约600个请求 – 我认为这意味着我的跟踪器已经优化,因为它只比服务相同的静态资产慢2倍反复。
然而,当我以数百万次的点击为基准时,我注意到了一些事情 –
我的问题 –
一个。 它看起来像我最大的这台服务器呢? 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
一旦您知道您的设置的容量,计算最大工作者连接是容易的。 总容量/核心数量是最大工人连接数。 计算总容量有多种方法。
如果你以上的方法不适合你,然后尝试下面的方法。 我正在做广泛的假设,忽略内存和IO,他们也将考虑因素,但这些会给你起点,你可以从那里进行调整。
假设带宽是瓶颈,取nginx正在服务的平均对象大小,并用你的带宽来分割,你将得到最大支持的qps。
在第二个假设中,CPU是瓶颈。 在这种情况下,请测量请求时间并将其除以1,然后再乘以系统中的核心数。 这会给nginx每秒可以处理的请求数量。