提高Django服务器速度

3

我的设置是Django 1.3以及Ubuntu 10.04的默认mod_wsgi和Apache软件包。我在开发虚拟机上测试了我的应用程序中的一个视图(DEBUG和调试工具栏已关闭):

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

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

我决定启动一个大型的ec2实例(4个cpu)来测试该类机器的性能表现,并惊讶地发现每秒只有13个请求。如何更改apache/mod_wsgi的配置以获得更好的性能?

我认为我正在使用worker而不是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个回答

3

确保关闭keep-alive。

我看到过更多的进程和单线程,当CPU是限制因素时,性能更好;尝试processes=4 threads=1


看起来已经解决了。现在每秒21个请求。另外,我记得那些大型EC2实例只有2个物理CPU。因此,将进程设置为2具有相同的好处。谢谢! - asciitaxi

2
调整mod_wsgi的最佳方法是不要使用它 :)
首先,我认为您的问题不是Web服务器:使用mod_wsgi可以获得数百个请求/秒。您可以通过缓存和数据库连接池获得更好的结果。如果您正在使用PostgreSQL,请查看pgpool II: http://pgpool.projects.postgresql.org/
但是,如果您想深入了解WSGI Web服务器,请仔细阅读这篇不错的基准测试:http://nichol.as/benchmark-of-python-web-servers
如果您不需要异步工作者,则gunicorn是一个不错的选择。它非常容易设置(您可以使用manage.py run_gunicorn运行它),而且速度相当快。如果您想确保mod_wsgi不是罪魁祸首,请尝试使用它。如果您想获得更好的性能,请使用gevent或uWSGI。
但Web服务器不会改变您的基准测试结果:您可以从每秒4个请求增加到每秒4.01个请求。

感谢 @vad。那是一篇非常全面的文章。将进程数更改为2似乎能够挤出更多的性能,但我同意,对于真正的收益来说,memcached可能是最好的选择。 - asciitaxi
不仅仅是Memcache。我建议也使用数据库连接池。你说你的查询只需要8毫秒,但那只是在你的DBMS上查询时间的总和。你没有考虑连接/网络时间。 - vad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接