如何使用 wsgi、django、php 和 apache2 追踪内存泄漏?

如何使用 wsgi、django、php 和 apache2 追踪内存泄漏?

我为我的网站运行了 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 配置。

相关内容