Apache2 mod_wsgi python 2.6 Django非常慢

Apache2 mod_wsgi python 2.6 Django非常慢

我尝试了大约 1000 次,但似乎无法弄清楚为什么使用 apache 2.2.14/wsgi latest/django 1.3 的简单 django 网站会很慢。我通过打开 mysql 慢查询日志记录确认问题不是我们的数据库。我又检查了 wsgi 守护进程配置设置大约 100 次,但仍然不明白为什么 runserver 目前比 apache 更快!

这是我的 apache 配置,如果还有其他有用的项目请告诉我!

WSGIDaemonProcess xxx display-name=xxx group=www-data user=www-data processes=25 threads=1
<VirtualHost *:80>
    ServerName www.xxx.com
    ServerAlias xxx.com
    ServerAlias localhost
    ServerAdmin [email protected]

    RewriteEngine Off
        RewriteCond %{HTTP_HOST} ^xxx\.com$ [NC]
        RewriteRule ^(.*)$ http://www.xxx.com$1 [R=301,L]
        RewriteCond %{REQUEST_URI} ^/login/$
        RewriteRule /login https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
        RewriteCond %{REQUEST_URI} ^/signup/
        RewriteRule /signup https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    ErrorLog /var/log/apache2/xxx-error.log
    LogLevel debug
    CustomLog /var/log/apache2/xxx-access.log combined

    WSGIProcessGroup %{GLOBAL}
    WSGIApplicationGroup %{GLOBAL}
    WSGIScriptAlias / /srv/xxx.com/mod_wsgi/dispatch.wsgi

Alias /static /srv/xxx.com/src/xxx/static
<Directory "/srv/xxx.com/src/xxx/static">
    Order deny,allow
    Allow from all
</Directory>
</VirtualHost>

自由的:

             total       used       free     shared    buffers     cached
Mem:           496        489          6          0          1         17
-/+ buffers/cache:        471         25
Swap:         1023         50        973

顶部:

top - 21:30:52 up  2:06,  1 user,  load average: 0.07, 0.10, 0.12
Tasks: 101 total,   2 running,  99 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.2%us,  1.2%sy,  0.0%ni, 95.4%id,  2.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    508272k total,   467788k used,    40484k free,     1448k buffers
Swap:  1048572k total,    59576k used,   988996k free,    22708k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                             
 5009 www-data  20   0  179m  41m 5024 R   20  8.3   0:02.59 apache2                                                              
 2521 elastic   20   0  710m  70m 4052 S    1 14.2   0:54.32 java                                                                 
 5013 root      20   0 19272 1252  932 R    0  0.2   0:00.05 top                                                                  
    1 root      20   0 23628 1108  784 S    0  0.2   0:00.18 init                                                                 
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd   

以下是 mpm_prefork_module 设置:

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

答案1

你有:

WSGIDaemonProcess xxx display-name=xxx group=www-data user=www-data processes=25 threads=1

但随后有:

WSGIProcessGroup %{GLOBAL}

这意味着您没有委托 WSGI 应用程序在该守护进程进程组中运行。

换句话说,您正在以嵌入模式运行 WSGI 应用程序,并且 WSGIDaemonProcess 指令是多余的。

如果您还使用 Apache prefork MPM,您可能会遇到速度问题,因为 Apache 在其默认配置中使用多达 150 个单线程进程。

因此,当请求实际到达时,速度缓慢可能是由于您的 WSGI 应用程序(如果它很大)的延迟加载造成的。

随着越来越多的请求涌入,Apache 必须不断启动新进程以满足不断增长的需求。如果请求量下降,Apache 将开始删除进程。如果请求量再次增加,它必须再次启动新进程并再次加载您的应用程序。

现在这是一个极端的情况,您可能受到的打击有多严重取决于 Apache MPM 的设置方式(您不会显示)以及您的流量状况。

在最坏的情况下,您甚至可能已经覆盖了 MaxRequestsPerChild 指令并告诉 Apache 在单个或少数几个请求之后终止进程,因此您可能一直强制重新加载应用程序。

有关此类问题的一些相关问题请阅读:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

所以这就是基于 Apache 配置的情况可能变得糟糕的原因。

忽略守护进程模式的错误配置,您有可能遇到应用程序问题。为此,我建议尝试使用性能监控工具。我偏向性的建议是 New Relic。即使您不想为这样的工具付费,它也会为所有功能提供两周的试用期,这足以让您找出瓶颈所在。

有关 New Relic 可以为 Python 做什么的示例,请查看:

http://blog.newrelic.com/2011/11/08/new-relic-supports-python/

相关内容