我试图了解为什么我的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)
请帮忙吗?
答案 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号码的大概)。