首页 文章

Django,python,mod_wsgi和Apache工作者

提问于
浏览
6

我刚刚从apache prefork转移到worker并开始在守护进程模式下运行mod_wsgi . 到现在为止还挺好 . 我还没有经历过最大负载,但是服务器似乎更加一致,我们没有看到随机请求花费2分钟等待mod_wsgi响应 . 内存占用已从3.5G增加到1G . 这太棒了 . 我们使用6G内存的单个VPS运行 . 这个sevrer上运行了一个Django应用程序以及一个memcache实例,我们已经分配了1G内存 . 我们有一个单独的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)但我们的网站在最小负载下减速 . 我猜测在请求进入时需要花费很长时间来启动服务器 . 我们从s3服务了90%的媒体 . 其他10%通过我们的https页面上的Apache或懒惰地指向我们的本地服务器的人提供 . 在标称负载下,最终会创建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>

我的网站的ssl端有一个不同的WSGIDaemonProcess / WSGIProcessGroup,好吧,根本感觉不对 . 我百分百肯定我在这里搞砸了什么 . 但更重要的是,我已经为mod_wsgi分配了200个40个线程来处理来自Apache的请求,留下160个线程来处理需要传递的任何媒体(通过ssl或不指向s3的懒惰) .

因此,鉴于上面的应用程序负载,有人可以建议我可以改善我的网站性能的方法吗?我正确处理ssl / mod_wsgi指令吗?格雷厄姆在哪里? ;)

1 回答

相关问题