Apache-2.2

mod_wsgi 記憶體洩漏?

  • August 11, 2010

我有一個 django 應用程序在 Nginx 反向代理(也提供靜態內容)後面的 Apache 2(Worker)上通過 mod_wsgi 執行。當應用程序開始同時獲得大量點擊時,記憶體使用量將從 <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

這裡 to 是 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 儲存庫安裝。Django 應用程序在 Django 1.2 上執行。

有任何想法嗎?

我實際上有我的懷疑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')

引用自:https://serverfault.com/questions/169495