我刚刚从Apache prefork移到worker,并开始在守护进程模式下运行mod_wsgi。 到现在为止还挺好。 我还没有经历最大负载,但服务器似乎更一致,我们没有看到随机请求需要2分钟等待一个mod_wsgi响应。 内存占用从3.5G到1G。 这太棒了。 我们正在用6G的RAM运行一个VPS。 有一个Django应用程序在这个sevrer上运行,还有一个memcache实例,我们已经为其分配了1G的ram。 我们有一个单独的MySql服务器。
我们的应用程序体积庞大,当然可以优化。 我们正在使用NewRelic来解决现在一些运行速度较慢的页面。 我读了很多关于优化mod_wsgi / apache的内容,但是和其他人一样,我仍然留下了一些问题。
我们的平均应用程序页面加载时间是650-750毫秒。 我们的很多页面都在200毫秒的范围内,但是我们有一些需要加载2-5秒的狗。 在正常的加载时间内,我们可以达到每秒15-20个请求,而在高峰时间每秒可以达到30-40个,这可能会持续30-60分钟。
这是我的apacheconfiguration,运行worker mpm。
StartServers 10 MaxClients 400 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0
我开始使用默认值(StatServers = 2和MaxClients = 150),但是我们的网站在最小负载下放慢了速度。 我猜,要求服务器花费很长时间才能启动服务器。我们正在为s3服务90%的媒体。 另外10%是通过我们的https页面上的Apache服务器,或者是懒洋洋地指向我们本地服务器的人。 在名义负载下,15个工作进程最终被创build,所以我想我应该设置StartServers = 15? 有了这个configuration,我假设我有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 / WSGIProcessGroup为我的网站的ssl方面,那么,只是不觉得正确的。 我100%肯定我在这里弄到了一些东西。 更重要的是,我已经为mod_wsgi分配了200 + 40个线程来处理来自Apache的请求,剩下160个线程来处理需要提交的任何媒体(通过ssl或懒惰不指向s3)。
所以考虑到我们的应用程序负载以上,任何人都可以build议我可以提高我的网站的性能的方式? 我正确地处理ssl / mod_wsgi指令吗? 格雷厄姆呢? ;)