我为我的网站运行了 3 个独立的虚拟主机(Django w/ wsgi 用于主站点,另一个 Django w/ wsgi 用于站点的移动版本,第三个用于 Wordpress 作为站点的博客)。几周后,交换内存攀升到我的加载和 ping 时间变得非常慢的地步。当我查看时top
,我发现有几个 Apache 进程每个都占用了大量内存,并且已经运行了至少一个小时。
这是在 Rackspace 云(中型实例)上运行的 Ubuntu 10.04 服务器。
我正在以守护进程模式(线程=1,进程=2)使用 wsgi 运行两个 django 站点。
我的 apache2.conf 的主要设置如下所示(删除了几个“不相关”的内容以尽量减少此帖子的大小 - 如果您期待其他设置,请告诉我,我可以检查是否有它):
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_event_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
我看到有人建议从 Apache 切换到“不那么臃肿”的 Web 服务器。我愿意接受这个想法,但我猜最好将 Wordpress 从服务器上移走,这样我就不需要 PHP 了(或者这些其他 Web 服务器是否同时提供 php 和 python 解决方案?)
如果您需要更多信息,请告诉我。谢谢!
答案1
使用 mod_wsgi 文档中所述的 display-name 选项来标记 mod_wsgi 守护进程。这样,您可以使用“ps”查看大型进程是否实际上是 mod_wsgi 守护进程。
http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess
如果它们非常胖,那么 Apache 或 mod_wsgi 就无关紧要了。这是因为您的应用程序本身就很胖。这可能是由于内存中缓存了过多的数据或资源泄漏。
如果标记的 mod_wsgi 守护进程模式进程不够大,那么您可能没有将 Python 应用程序委托给守护进程正确运行。或者您的 PHP 应用程序存在问题。
http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Embedded_Or_Daemon_Mode
简而言之,当您的应用程序很胖时,无论您使用什么托管机制都无关紧要,它们仍然很胖,并且 Apache 和 mod_wsgi 与它无关,除非您填满了 Apache 配置。