Django、python、mod_wsgi和Apache worker

Django、python、mod_wsgi和Apache worker,python,django,apache,mod-wsgi,Python,Django,Apache,Mod Wsgi,我刚从ApachePrefork转到worker,开始在守护进程模式下运行mod_wsgi。到目前为止,一切顺利。我还没有体验到最大负载,但服务器似乎更加一致,我们没有看到随机请求等待mod_wsgi响应需要2分钟。内存占用从3.5G增加到1G。这太棒了。我们在一个VPS上运行,有6G内存。这台服务器上运行着一个Django应用程序和一个memcache实例,我们为其分配了1G的ram。我们有一个单独的MySql服务器 我们的应用程序非常庞大,当然可以进行优化。我们现在正在使用NewRelic对

我刚从ApachePrefork转到worker,开始在守护进程模式下运行mod_wsgi。到目前为止,一切顺利。我还没有体验到最大负载,但服务器似乎更加一致,我们没有看到随机请求等待mod_wsgi响应需要2分钟。内存占用从3.5G增加到1G。这太棒了。我们在一个VPS上运行,有6G内存。这台服务器上运行着一个Django应用程序和一个memcache实例,我们为其分配了1G的ram。我们有一个单独的MySql服务器

我们的应用程序非常庞大,当然可以进行优化。我们现在正在使用NewRelic对一些运行速度较慢的页面进行故障排除。我已经读了很多关于优化mod_wsgi/apache的文章,但和其他人一样,我还有几个问题要问

我们的平均应用程序页面加载时间为650-750ms。我们的很多页面都在200毫秒范围内,但是我们有一些狗需要2-5秒以上的时间来加载。我们在正常加载时间内每秒收到15-20个请求,在峰值时间内每秒收到30-40个请求,这可能会持续30-60分钟

这是我的apache配置,运行worker mpm

StartServers        10
MaxClients         400
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
我一开始使用默认设置(StatServers=2和MaxClients=150),但我们的站点在负载最小的情况下慢了下来。我猜随着请求的到来,服务器的运转需要很长时间。我们90%的媒体都来自s3。另外10%是通过Apache在我们的https页面上提供的,或者有人懒洋洋地指向我们的本地服务器。在标称负载下,会创建15个工作进程,所以我认为应该将StartServers设置为15?在这种配置下,我假设有15个工作进程正在运行(我可以用NewRelic确认),每个进程有25个线程(我不知道如何确认,估计是400/15)

我的apache/mod_wsgi指令如下所示:

<VirtualHost *:80>
    # Some stuff
    WSGIDaemonProcess app1 user=http group=http processes=10 threads=20
    WSGIProcessGroup app1
    WSGIApplicationGroup app1
    WSGIScriptAlias / /path/to/django.wsgi
    WSGIImportScript /path/to/django.wsgi process-group=app1 application-group=app1    
    # Some more stuff    
</VirtualHost>

<VirtualHost *:443>
    # Some stuff
    WSGIDaemonProcess app1-ssl user=http group=http processes=2 threads=20
    WSGIProcessGroup app1-ssl
    WSGIApplicationGroup app1-ssl
    WSGIScriptAlias / /path/to/django.wsgi
    WSGIImportScript /path/to/django.wsgi process-group=app1-ssl application-group=app1-ssl
    # Some more stuff
</VirtualHost>

#一些东西
WSGIDaemonProcess app1用户=http组=http进程=10个线程=20
WSGIProcessGroup app1
WSGIApplicationGroup app1
WSGIScriptAlias//path/to/django.wsgi
WSGIImportScript/path/to/django.wsgi进程组=app1应用程序组=app1
#再来点东西
#一些东西
WSGIDaemonProcess app1 ssl用户=http组=http进程=2个线程=20
WSGIProcessGroup app1 ssl
WSGIApplicationGroup app1 ssl
WSGIScriptAlias//path/to/django.wsgi
WSGIImportScript/path/to/django.wsgi进程组=app1 ssl应用程序组=app1 ssl
#再来点东西
在我的站点的ssl端使用不同的WSGIDaemonProcess/WSGIProcessGroup,感觉一点都不对劲。我百分之百肯定我把这里搞砸了。更重要的是,我为mod_wsgi分配了200+40个线程来处理来自Apache的请求,剩下160个线程来处理任何需要交付的媒体(通过ssl或不指向s3的惰性)

所以,考虑到我们上面的应用程序负载,有人能建议我如何提高我的站点性能吗?我是否正确处理ssl/mod_wsgi指令?格雷厄姆在哪里

见以下讨论:


我度假已有几个星期了。几天后回家。如果你想确保我的答案,最好将问题发送到mod_wsgi列表。Graham也发表了一些与此主题相关的博客文章。所有标记为mod_wsgi的内容都是相关的,但我发现这些在解决性能问题时最有用。