我的设置是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测试并获得相同的结果
答案 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。