加快django服务器

时间:2011-04-22 20:38:15

标签: django performance apache mod-wsgi

我的设置是django 1.3和ubuntu 10.04的默认mod_wsgi和apache包。我在我的开发VM上测试了我的应用程序的一个视图(DEBUG和调试工具栏关闭):

ab -n 200 -c 5 http://127.0.0.1/

每秒收到4个请求。这似乎很慢,所以我简化了查询,使用索引等,调试工具栏告诉我有4个查询需要8ms。运行相同的测试,我每秒只能获得8个请求。 CPU似乎一直处于100%。对于现在非常简单的视图来说,这似乎很慢,但它只是一个低功耗的VM。

我决定启动一个大型的ec2实例(4个cpu),看看我会在这类机器上获得什么样的性能,并且惊讶于每秒只能获得13个请求。如何更改apache / mod_wsgi的配置以从这类机器中获得更高的性能?

我认为我使用的是工人而不是prefork:

$ /usr/sbin/apache2 -l
Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  worker.c
  http_core.c
  mod_so.c

我的工作人员配置是:

<IfModule mpm_worker_module>
    StartServers          2   
    MinSpareThreads      25  
    MaxSpareThreads      75  
    ThreadLimit          64  
    ThreadsPerChild      25  
    MaxClients          150 
    MaxRequestsPerChild   0   
</IfModule>

我的WSGI设置如下所示:

WSGIScriptAlias / /home/blah/site/proj/wsgi.py
WSGIDaemonProcess blah user=blah group=blah processes=1 threads=10
WSGIProcessGroup blah

非常感谢你的帮助!

注意:我尝试从另一个实例进行ab测试并获得相同的结果

2 个答案:

答案 0 :(得分:3)

确保保持活着状态。

更多进程和单线程我已经看到了更好的性能,其中CPU是限制因素;试试processes=4 threads=1

答案 1 :(得分:2)

调整mod_wsgi的最佳方法是不使用它:)

首先:我认为您的问题不是Web服务器:使用mod_wsgi,您可以获得数百个请求/秒。通过缓存和数据库连接池可以获得更好的结果。如果您正在使用postgres,请查看pgpool II:http://pgpool.projects.postgresql.org/

但是,如果您想深入了解wsgi Web服务器,请仔细阅读这个不错的基准:http://nichol.as/benchmark-of-python-web-servers

如果你不需要异步工人,枪炮是个不错的选择。它很容易设置(您可以使用manage.py run_gunicorn运行它)并且速度非常快。如果你想确定mod_wsgi不是重点,那就试试吧。如果你想要更好的表现,请使用gevent或uWSGI。

但是Web服务器不会改变你的基准:你可以从4 req / s到4.01 req / s。