Django,每秒低的请求与gunicorn 4工人

时间:2013-03-05 10:42:47

标签: django django-templates memcached gunicorn

我试图了解为什么我的django网站(gunicorn 4工作人员)在重负载下运行缓慢,我做了一些分析http://djangosnippets.org/snippets/186/没有任何明确的答案所以我从头开始使用{{1}进行一些负载测试}

简单的Httpreponse(“hello world”)没有中间件==> 3600req / s

带有中间件的简单Httpreponse(“hello world”)(缓存会话,缓存身份验证)==> 2300req / s

只打印表单的简单render_to_response(缓存模板)==> 1200req / s(响应时间除以2)

带有50个memcache查询的简单render_to_response ==> 157req / S

Memcache查询应该比这快得多(我正在使用PyLibMCCache)? 模板渲染是否与此结果一样慢?

我尝试了不同的分析技术而没有任何成功。

ab -n 1000 -c 100 http://localhost:8888/

我正在使用ubuntu 12.04(6Go ram,core i5)

请帮忙吗?

2 个答案:

答案 0 :(得分:1)

这实际上取决于执行memcached请求和打开新连接需要多长时间(django在请求完成时关闭连接),你的worker和memcached都能够处理更多压力但当然如果它需要5 / 10ms才能进行memcached调用,然后其中50个将成为瓶颈,因为您的网络延迟乘以呼叫计数。

现在你只是对django,gunicorn,你的机器和你的网络进行基准测试。

除非你在这个级别上有一些非常错误的东西,否则这些测试不会给你带来非常有趣的发现。

使用你的应用程序的速度减慢很可能与你使用db和memcached的方式有关(也许在模板渲染时)。

出于这个原因,我真的建议你使用django调试工具栏,看看你真实页面中发生了什么。

如果发现打开与memcached的连接是瓶颈,您可以尝试使用连接池并保持连接打开。

答案 1 :(得分:0)

您可以调查memcached性能。

$ python manage.py shell
>>> from django.core.cache import cache
>>> cache.set("unique_key_name_12345", "some value with a size representative of the real world memcached usage", timeout=3600)
>>> from datetime import datetime
>>> def how_long(n):
        start = datetime.utcnow()
        for _ in xrange(n):
            cache.get("unique_key_name_12345")
        return (datetime.utcnow() - start).total_seconds()

通过这种往返测试,我发现在我的服务器上,1个memcached查找大约需要0.2毫秒。

django.core.cache和pylibmc的问题在于函数是阻塞的。在HTTP请求的往返中,您可能会获得该数量的50倍。 50次0.2 ms已经是10 ms。

如果您在没有memcached的4名工作人员上达到1200 req / s,则平均HTTP往返时间为1 /(1200/4)= 3.33 ms。添加10毫秒,它变为13.33毫秒。 4名工人的吞吐量将下降到300 req / s(这恰好是157号码的大概)。