我有一个使用mod_wsgi(embedded模式; 更快的模式 ,如果configuration正确的话)运行几十个Python Django站点的Ubuntu 10.04盒子。 业绩波动很大。 有时很快,有时延迟几秒钟。 吸烟图是在这个地方。
最近,我还为静态内容添加了一个nginx代理,希望它可以治愈高度波动的performance。 但是,尽pipe它减less了Apache必须处理的请求数量,但并没有帮助解决主要问题。
在运行htop时点击网站时,可以看到有时候请求几乎是即时的,而有时则会导致Apache几秒钟内消耗100%的CPU。 我真的不明白这种波动来自哪里。
我已经为Apacheconfiguration了mpm_worker,如下所示:
StartServers 1 MinSpareThreads 50 MaxSpareThreads 50 ThreadLimit 64 ThreadsPerChild 50 MaxClients 50 ServerLimit 1 MaxRequestsPerChild 0 MaxMemFree 2048
1个服务器,50个线程,最多50个客户端。 Munin和apache2ctl -t都performance出一致的工人存在; 它们并不是一直被破坏和创造的。 然而,它的行为如此。
这告诉我,一旦一个子解释器被创build,它应该保留在内存中,但似乎网站必须重新加载。
我也有一个nginx + gunicorn框,performance相当好。 我真的想知道为什么Apache是如此随机。
这是一个虚拟主机configuration:
<VirtualHost *:81> ServerAdmin [email protected] ServerName example.com DocumentRoot /srv/http/site/bla Alias /static/ /srv/http/site/static Alias /media/ /srv/http/site/media WSGIScriptAlias / /srv/http/site/passenger_wsgi.py <Directory /> AllowOverride None </Directory> <Directory /srv/http/site> Options -Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory>
编辑:我已经把一些代码放在一个站点的settings.py文件中,每当它加载的时候把date写入一个tmp文件。 现在我可以看到,网站并不是随机重新加载的,所以Apache必须将其保存在内存中。 所以,这很好,除非它不能使我接近答案…
编辑:我刚刚发现一个错误,也可能与此有关:
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__ errread, errwrite) File "/usr/lib/python2.6/subprocess.py", line 1049, in _execute_child self.pid = os.fork() OSError: [Errno 12] Cannot allocate memory
服务器有2000 MB的600免费,这应该是很多。 有没有在Apache或WSGI上设置的限制?
您是否尝试过使用New Relic来尝试在Web应用程序中确定它是否是一个问题? 可用的免费套餐,也是一个初始的完整试用。 它可以给你什么概述:
如果所使用的后端服务的Web应用程序的特定问题不成问题,则WSGI服务器容量分析报告可能会显示一些信息,同时会告诉您是否耗尽容量。 它也可以告诉你,你是否过度configuration和浪费资源,实际上往往是这样。
顺便说一句,我一般build议不要在一个进程中使用50个请求线程。 你最好使用大约5个线程和多个进程。 确切地说,最好的方法确实取决于特定的应用程序,是否执行了大量的CPU绑定工作,以及要处理长时间运行的请求。 无论是通过相同的Apache来提供大量的静态文件,也会对其造成影响,mod_wsgi的守护进程模式甚至可能是更好的整体解决scheme。
你也在一个非常老的mod_wsgi版本,虽然不相信会导致一个问题。
最后,为避免Python的某些第三方C扩展模块出现问题,如果这是该服务器上唯一的WSGI应用程序,请设置:
WSGIApplicationGroup %{GLOBAL}
我修好了它。 我把所有的生产站点都转换成了守护进程模式,使用他们自己的进程(所有的开发站点都在一个进程中)。 吸烟图现在好多了。 性能稳定。
这仍然让我在黑暗中为什么embedded式模式有这些问题,因为据我可以告诉我没有进程创build/销毁,但至less我有一个更好的运行服务器。
编辑:
作为一个在Apache网站configuration的例子:
WSGIDaemonProcess mysite12 processes=1 threads=10 display-name=%{GROUP} WSGIProcessGroup mysite12
然后对于低优先级的网站,我把它放在wsgi.conf :
WSGIDaemonProcess developmentsites processes=1 threads=15 display-name=%{GROUP}
然后在apache conf中:
WSGIProcessGroup developmentsites
看看差异(也因为nginx代理):
