
Ich habe eine Django-App, die über mod_wsgi auf Apache 2 (Worker) hinter einem Nginx-Reverse-Proxy läuft (der auch statische Inhalte bereitstellt). Wenn die App viele Zugriffe gleichzeitig erhält, steigt die Speichernutzung von <20 % auf >96 % und die gesamte Anwendung kommt zum Stillstand.
Hier sind meine Apache WSGI-Konfigurationen:
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
Hier ist die Ausgabe von 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
Ich habe versucht, die Last mit einem zweiten Apache-Server hinter Nginx auszugleichen, aber das hat anscheinend nicht viel geholfen.
Der Server ist Ubuntu 10.04 mit Apache/mod_wsgi/nginx, alles aus den Ubuntu-Repos installiert. Die Django-App läuft auf Django 1.2.
Irgendwelche Ideen?
Antwort1
Ich habe tatsächlich meine Zweifel, dass mod_wsgi
es ein Speicherleck gibt. Ich vermute, dass Ihre Django
App ein Speicherleck hat. Ich persönlich habe noch nie Hinweise auf mod_wsgi
Speicherlecks gefunden und ich betreibe ein halbes Dutzend mod_wsgi
Server.
Bei Django ist die Lage jedoch anders. Es ist ein riesiges Projekt und in einigen Modulen kommt es zu Speicherverlusten. Die meisten (alle?) der bekannten Probleme wurden jedoch behoben Django 1.1+
.
Also... ich vermute, dass etwas in Ihrem Skript undicht ist. Führen Sie einen bestimmten Code aus, der Probleme verursachen könnte? Welche Art von Test führen Sie genau aus? Einen vollständigen Site-Test mit etwas wie siege
? Oder einen einfachen Test auf einer Seite mit ab
?
Zeigen Sie ungeachtet dessen den Code, den Sie ausführen, und/oder testen Sie mit etwas so Einfachem wie Folgendem, ob weiterhin Speicherlecks auftreten:
def hello_world(request):
return HttpResponse('Hello World!', mimetype='text/plain')