Django中的并发性能(apache2 prefork/mod_wsgi),我做错了什么?

sch*_*ick 6 django concurrency performance mod-wsgi apache2

首先,我对Django支持的网站的性能没有任何不满,它没有获得大量流量,到目前为止每天访问量超过1000次.

我很好奇它能够应对繁忙的交通高峰,所以我用ab工具做了一些基准测试.

我注意到并发大于1时的性能提供了与1个并发连接相同的大量请求.

reqs/s不应该随着并发性而增加吗?

我在一台具有1 GB RAM,apache2(prefork),mod_wsgi,memcached和mysql的虚拟机上.
页面上的所有内容都已缓存,数据库不会受到任何点击.如果memcached将丢弃该条目,则只有2个轻(索引)查询 - 并且应立即重新缓存.

基准测试数据:(注意:我用2000和10k请求对其进行基准测试,结果相同)

首页,由django通过apache2/mod_wsgi提供:
-n100 -c4:http://dpaste.com/97999/ (58.2
reqs/s)-n100 -c1:http://dpaste.com/97998/ (57.7请求数/秒)

对于robots.txt,直接来自apache2:
-n100 -c4:http://dpaste.com/97992/ (4917
reqs/s)-n100 -c1:http://dpaste.com/97991/ (1412 reqs/s )

这是我的apache conf:http://dpaste.com/97995/

编辑:添加了更多信息

wsgi.conf:http://dpaste.com/98461/

mysite.conf:http://dpaste.com/98462/

我的wsgi-handler:

import os, sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Run Code Online (Sandbox Code Playgroud)

Gra*_*ton 12

由于您在嵌入式模式下使用prefork MPM和mod_wsgi以及大量进程,因此可能会破坏盒子的性能.首先,建议您阅读:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

像您一样使用嵌入式模式,您需要仔细调整MPM参数.将MaxRequestsPerChild设置为非零并不是一个好的开始,因为您将定期强制执行A​​pache进程,结果是您将导致负载高峰,因为一切都必须重新加载.

建议工作者MPM和您的Python Web应用程序以mod_wsgi守护程序模式运行.这一开始将导致运行的进程少得多,内存开销减少,并且可以提高系统性能的可预测性.然后可以开始更仔细地观察为什么事情可能会变慢.

要注意的一件事是你得到的'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
Run Code Online (Sandbox Code Playgroud)

如果最大列显示较大的值,那么您将受到应用程序加载成本的影响,因为您要么不通过预加载或通过短流程重启间隔从测试中删除它们.

  • 如果您正在使用守护程序模式来运行Python WSGI应用程序,那么运行worker MPM并不是那么重要,因为Python代码不再在核心Apache服务器子进程中运行.如果您还使用mod_php运行PHP,那么无论如何您仍然会遇到运行prefork MPM的问题.但是,如果不依赖于mod_php或任何其他需要单线程Apache进程的Apache模块,那么最好使用worker MPM.即使您仍然需要运行单线程prefork MPM,mod_wsgi守护程序进程仍然可以是多线程的. (2认同)