mod_wsgi 内存泄漏?

mod_wsgi 内存泄漏?

我有一个 django 应用程序,通过 Apache 2 (Worker) 上的 mod_wsgi 运行,位于 Nginx 反向代理 (也提供静态内容) 后面。当应用程序开始同时获得大量点击时,内存使用率将从 <20% 飙升至 >96%,整个应用程序陷入停顿。

这是我的 Apache WSGI 配置:

WSGIDaemonProcess djangoboss user=django group=django processes=2 maximum-requests=500 threads=1 python-path=/home/django/django_env/lib/python2.6/site-packages display-name=%{GROUP}
WSGIProcessGroup djangoboss
WSGIScriptAlias / /home/django/django/wsgi/django_wsgi_handler.py

以下是 htop 的输出:

  PID USER     PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command                                                                                                                                           
29551 django      20   0  793M  745M  6868 R 61.0 42.8  1:28.65 (wsgi:djangoboss)   -k start                                                                                                                        
29550 django      20   0  793M  745M  6868 S  0.0 42.8  0:00.01 (wsgi:djangoboss)   -k start
29549 django      20   0  793M  745M  6868 S  0.0 42.8  0:00.00 (wsgi:djangoboss)   -k start
29548 django      20   0  793M  745M  6868 S  0.0 42.8  0:00.00 (wsgi:djangoboss)   -k start
30778 django      20   0  192M  176M  6356 S  0.0 10.2  0:12.15 /home/django/django_env/bin/python /home/django/django/manage.py post_content
27544 django      20   0 86028 43160  6892 S  0.0  2.4  0:00.01 (wsgi:djangoboss)   -k start
27545 django      20   0 86028 43160  6892 S  0.0  2.4  0:12.92 (wsgi:djangoboss)   -k start
27542 django      20   0 86028 43160  6892 S  0.0  2.4  0:00.00 (wsgi:djangoboss)   -k start
27543 django      20   0 86028 43160  6892 S  0.0  2.4  0:00.00 (wsgi:djangoboss)   -k start

我尝试在 Nginx 后面使用第二个 Apache 服务器进行负载平衡,但这似乎没有太大帮助。

服务器是 Ubuntu 10.04,apache/mod_wsgi/nginx 均从 ubuntu repos 安装。Django 应用程序在 Django 1.2 上运行。

有任何想法吗?

答案1

我实际上怀疑是mod_wsgi内存泄漏。我猜是你的Django应用程序在泄漏。我个人从未发现任何mod_wsgi内存泄漏的证据,而且我运行了六台mod_wsgi服务器。

然而,Django 的情况则不同。这是一个庞大的项目,在某些模块中会出现一些内存泄漏。但大多数(所有?)已知问题已在 中得到修复Django 1.1+

所以……我猜你的脚本中有些东西泄露了。你正在运行可能导致问题的特定代码吗?你到底在运行哪种测试?使用类似 的全站测试siege?还是使用 的 1 页简单测试ab

无论如何,请显示您正在运行的代码和/或使用以下简单方法测试是否仍然存在内存泄漏:

def hello_world(request):
    return HttpResponse('Hello World!', mimetype='text/plain')

相关内容