我尝试了大约 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/