Django、Python、mod_wsgi和Apache worker

6
我刚从apache prefork迁移到worker并开始在守护进程模式下运行mod_wsgi。到目前为止,一切都很好。我还没有遇到最大负载,但服务器似乎更加稳定,我们不会看到随机请求等待2分钟以获取mod_wsgi响应。内存占用从3.5G降至1G。这太棒了。我们在一个单独的VPS上运行,有6G的RAM。除了一个分配了1G RAM的memcache实例外,此服务器上还运行着一个Django应用程序。我们有一个单独的MySql服务器。
我们的应用程序庞大,肯定可以进行优化。我们现在正在使用NewRelic来解决一些运行缓慢的页面问题。我已经阅读了很多关于优化mod_wsgi / apache的文章,但像其他人一样,我仍然有一些问题。
我们的平均应用程序页面加载时间为650-750ms。我们的许多页面在200ms范围内,但是我们有一些需要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%通过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>

我在我的网站中为ssl功能设置了不同的WSGIDaemonProcess/WSGIProcessGroup,这感觉非常不对。我百分之百确定我弄错了什么。然而更重要的是,我已经为mod_wsgi分配了200+40个线程处理Apache请求,留下160个线程来处理需要提供(通过ssl或者因为懒惰没有指向s3)的任何媒体。

基于我们上面的应用负载情况,有人能建议我如何提高网站性能吗?我是否正确处理了ssl/mod_wsgi指令? Graham在哪里? ;)


2
我已经度过了几周的假期,还有几天就回家了。如果你想确保我回答,请将问题发送到mod_wsgi列表。 - Graham Dumpleton
Graham还发布了几篇与此主题相关的博客文章。所有标记为mod_wsgi的内容都是相关的,但我发现这些在解决性能问题方面最有用。http://blog.dscpl.com.au/2014/02/use-of-threading-in-modwsgi-daemon-mode.html http://blog.dscpl.com.au/2014/02/vertically-partitioning-python-web.html - scoopseven
网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接