我有一个 Ubuntu 10.04 机器,使用 mod_wsgi 运行几十个 Python Django 站点(嵌入式模式;如果配置正确,则为更快的模式)。性能波动很大。有时很快,有时延迟几秒钟。吸烟图到处都是。
最近,我还为静态内容添加了一个 nginx 代理,希望它可以解决性能波动很大的问题。但是,即使它显着减少了 Apache 必须处理的请求数量,它也无助于解决主要问题。
在运行 htop 的同时点击网站时,可以看到有时请求几乎是即时的,而有时它会导致 Apache 在几秒钟内消耗 100% CPU。我真不明白这种波动是从哪里来的。
我已经为 Apache 配置了 mpm_worker,如下所示:
StartServers 1
MinSpareThreads 50
MaxSpareThreads 50
ThreadLimit 64
ThreadsPerChild 50
MaxClients 50
ServerLimit 1
MaxRequestsPerChild 0
MaxMemFree 2048
1 台服务器,50 个线程,最多 50 个客户端。穆宁和apache2ctl -t
两者都显示出始终如一的工人存在;它们不会一直被破坏和创造。然而,它的行为就是这样。
这告诉我,一旦创建了子解释器,它应该保留在内存中,但似乎站点必须一直重新加载。
我还有一个 nginx+gunicorn 盒子,它的表现相当不错。我真的很想知道为什么 Apache 如此随机。
这是一个虚拟主机配置:
<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
- 阿帕奇 2.2.14
- mod_wsgi 2.8
- nginx 0.7.65
编辑:我在站点的 settings.py 文件中放置了一些代码,该站点在加载时将日期写入 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
服务器有 600 个 2000 MB 可用空间,应该足够了。Apache 或 WSGI 的某个地方是否设置了限制?
您是否尝试过使用 New Relic 来尝试确定它是否是您的 Web 应用程序中的问题?提供免费层级和初始完整试用版。它可以为您提供的概述:
如果使用的后端服务的 Web 应用程序的特定问题没有作为问题突出,WSGI 服务器容量分析报告可能会显示一些内容,这会告诉您是否正在耗尽容量。它还可以告诉您是否过度配置和浪费资源,这实际上经常发生。
顺便说一句,一般来说,我建议不要在一个进程中使用 50 个请求线程。你最好使用大约 5 个线程和多个进程。究竟什么是最好的确实取决于具体的应用程序,它是否在做大量的 CPU 密集型工作,以及它必须处理多少长时间运行的请求。是否通过同一个 Apache 提供大量静态文件也会对其产生影响,mod_wsgi 的守护进程模式甚至可能是一个更好的整体解决方案。
您还使用了一个非常旧的 mod_wsgi 版本,尽管不相信这会导致问题。
最后,为了避免 Python 的某些第三方 C 扩展模块出现问题,如果这是该服务器上唯一的 WSGI 应用程序,请设置:
我修好了它。我将所有生产站点转换为使用它们自己的进程(以及所有开发站点都在一个进程中),以守护程序模式。吸烟图现在好多了。性能稳定。
这仍然让我对为什么嵌入式模式会出现这些问题一无所知,因为据我所知,我没有进程创建/销毁,但至少我有一个更好的运行服务器。
编辑:
作为 apache 站点配置的示例:
然后对于低优先级站点,我将其放入
wsgi.conf
:然后在 apache conf 中:
看看区别(也是因为nginx代理):