mod_wsgi記憶體洩漏?

mod_wsgi記憶體洩漏?

我有一個 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

這是 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 上運行。

有任何想法嗎?

答案1

我實際上懷疑是否mod_wsgi洩漏了。我的猜測是您的Django應用程式正在洩漏。我個人從未發現任何mod_wsgi記憶體洩漏的證據,並且我運行了六台mod_wsgi伺服器。

然而姜戈卻是一個不同的故事。這是一個巨大的項目,在某些模組中會出現一些記憶體洩漏。但大多數(全部?)已知問題已在Django 1.1+.

所以...我猜測你的腳本中的某些內容正在洩漏。您是否運行任何可能導致問題的特定程式碼?您正在運行什麼樣的測試?完整的站點測試,例如siege?或在一頁上進行簡單測試ab

無論如何,請顯示您正在運行的程式碼和/或測試您是否仍然存在記憶體洩漏,如下所示:

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

相關內容