我有一个 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')