Apache + mod_wsgi上的Python Django站点与nginx代理:高度波动的性能

我有一个使用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> 
  • Ubuntu 10.04
  • Apache 2.2.14
  • mod_wsgi 2.8
  • nginx 0.7.65

编辑:我已经把一些代码放在一个站点的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代理):

在这里输入图像说明