首先,我对以Django为基础的网站的性能丝毫不满意,它的访问量并没有增加,到目前为止,每天的访问量超过1000。
我很好奇它如何应付繁忙的交通高峰,所以我使用了ab工具进行一些基准测试。
我注意到并发大于1时的性能提供了与1个并发连接相同的请求量。
请求数是否应该随并发性增加?
我在具有1 GB RAM,apache2(prefork),mod_wsgi,memcached和mysql的虚拟机上。
页面上的所有内容均已缓存,数据库未受到任何点击。而且,如果memcached会删除该条目,则只有2个轻量(索引)查询-应该立即重新缓存。
基准测试数据:(注意:我确实用2000和1万个请求进行了基准测试,结果相同)
对于起始页面,由django通过apache2/mod_wsgi提供:
-n100 -c4:http://dpaste.com/97999/(58.2请求/秒)
-n100 -c1:http://dpaste.com/97998/(57.7请求/秒)
对于robots.txt,直接从apache2:
-n100 -c4:http://dpaste.com/97992/(4917请求/秒)
-n100 -c1:http://dpaste.com/97991/(1412请求/秒)
这是我的Apache conf:http://dpaste.com/97995/
编辑:添加了更多信息
wsgi.conf:http://dpaste.com/98461/
mysite.conf:http://dpaste.com/98462/
我的wsgi处理程序:
import os, sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
最佳答案
在嵌入式模式下使用带有许多进程的prefork MPM和mod_wsgi时,您可能会破坏包装盒的性能。首先,建议您阅读:
http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html
使用像您一样的嵌入式模式,您需要仔细调整MPM参数。将MaxRequestsPerChild设置为非零不是一个好的开始,因为您将定期强制执行Apache进程,结果将导致负载高峰,因为必须重新加载所有内容。
建议使用MPM并在mod_wsgi守护程序模式下运行Python Web应用程序。首先,这将减少运行的进程,减少内存开销,并为系统性能提供更多的可预测性。然后可以开始更仔细地研究为什么事情运行速度变慢。
要注意的一件事是您在“ab”输出的以下部分中所获得的内容:
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 0 0 0.2 0 2
Waiting: 0 0 0.1 0 2
Total: 0 0 0.2 0 2
如果max列显示较大的值,那么您将受到应用程序加载成本的打击,这是因为您没有通过预加载消除它们,或者通过较短的进程重新启动间隔将它们从测试中消除了。
关于django - Django中的并发性能(apache2 prefork/mod_wsgi),我在做什么错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1475960/