Django,python,mod_wsgi和Apache工作者

Django, python, mod_wsgi and Apache worker

我刚从ApachePrefork转到Worker,开始在守护进程模式下运行mod wsgi。到目前为止,一切都很好。我还没有经历过最大负载,但是服务器看起来更一致,我们没有看到随机请求需要2分钟等待mod wsgi响应。内存占用从3.5g增加到1g。这太棒了。我们在一个6克内存的VP上运行。这个服务器上有一个Django应用程序和一个memcache实例一起运行,我们已经将1g RAM分配给了它。我们有一个单独的MySQL服务器。

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

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

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

1
2
3
4
5
6
StartServers        10
MaxClients         400
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0

我从默认值开始(statservers=2,maxclients=150),但是我们的站点在最小负载下慢了很多。我猜,当请求进入时,需要很长时间才能启动服务器。我们90%的媒体来自S3。另外10%是通过我们的HTTPS页面上的Apache提供服务的,或者有人懒散地指向我们的本地服务器。在名义负载下,最终会创建15个工作进程,所以我想我应该只设置startservers=15?使用这个配置,我假设我有15个工作进程正在运行(我可以用newrelic确认),每个进程有25个线程(我不知道如何确认,猜测是400/15)。

我的apache/mod wsgi指令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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>

在我的站点的ssl端有一个不同的wsgidaemonprocess/wsgiprocessgroup,好吧,这一点都不合适。我百分之百肯定我把这里弄脏了。不过,更重要的是,我已经为mod wsgi分配了200+40个线程来处理来自Apache的请求,留下160个线程来处理需要交付的任何媒体(通过SSL或不指向S3的惰性)。

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


参见讨论:

https://groups.google.com/forum/?从组=主题/modwsgi/hakr6fjrvqm