2013-03-05 10 views
9

Ich versuche zu sehen, warum meine Django-Website (Gunicorn 4 Arbeiter) langsam ist unter Schwerlast, habe ich einige Profilerstellung http://djangosnippets.org/snippets/186/ ohne klare Antwort, so begann ich einige Belastungstests aus Kratzer ab -n 1000 -c 100 http://localhost:8888/Django, niedrige Anfragen pro Sekunde mit Gunicorn 4 Arbeiter

Ein einfaches Httpreponse ("Hallo Welt") keine Middleware ==> 3600req/s

Ein einfaches Httpreponse ("Hallo Welt") mit Middle (gecached Sitzung im Cache-Authentifizierung) mit ==> 2300req/s

Eine einfache render_to_response, die nur ein Formular (zwischengespeicherte Vorlage) ==> 12 ausdruckt 00req/s

(Reaktionszeit wurde durch 2 geteilt)

Ein einfaches render_to_response mit 50 memcache Abfragen ==> 157req/s

Memcache Abfragen sollten als die viel schneller sein (ich bin mit PyLibMCCache)? Ist das Schablonen-Rendering so langsam wie dieses Ergebnis?

Ich habe verschiedene Profiling-Techniken ohne Erfolg ausprobiert.

$ ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 46936 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 400000 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 46936 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

$ sysctl -p 

fs.file-max = 700000 
net.core.somaxconn = 5000 
net.ipv4.tcp_keepalive_intvl = 30 

Ich bin mit Ubuntu 12.04 (6Go RAM, Core i5)

Jede Hilfe bitte?

+1

+1 für die Forschung, die Sie taten – Private

+0

Es hängt ... was machen Sie in den Ansichten? Welche Abfragen führen Sie aus? Worauf fährst du sie? – ionelmc

+0

ist Ihr memcached Server auf demselben Computer oder auf einem externen? –

Antwort

1

Es hängt wirklich davon ab, wie lange es dauert, eine memcached Anfrage zu machen und eine neue Verbindung zu öffnen (django schließt die Verbindung sobald die Anfrage beendet ist), sowohl Ihr worker als auch memcached können viel mehr Stress bewältigen, aber natürlich wenn Es dauert 5/10ms, um einen Memcached-Anruf auszuführen, dann werden 50 von ihnen der Engpass sein, da Sie die Netzwerklatenz multipliziert mit der Anrufanzahl haben.

Gerade jetzt messen Sie nur Django, Gunicorn, Ihre Maschine und Ihr Netzwerk.

Es sei denn, Sie haben etwas extrem falsch auf dieser Ebene, diese Tests werden Sie nicht auf sehr interessante Entdeckungen hinweisen.

Was ist Verlangsamung Ihrer App ist sehr wahrscheinlich mit der Art, wie Sie Ihre db und memcached (und vielleicht bei Vorlage Rendering) verwandt sein.

Aus diesem Grund empfehle ich Ihnen wirklich, django debug toolbar zu bekommen und zu sehen, was passiert in Ihren realen Seiten.

Wenn sich herausstellt, dass das Öffnen einer Verbindung zu Memcached der Engpass ist, können Sie versuchen, einen Verbindungspool zu verwenden und die Verbindung offen zu halten.

+0

Ich habe all das Zeug (Memcache-Debug-Panel, Profiling ...), im Grunde iIsoled mein Problem durch Minimierung der Memcache-Abfragen und Speichern des HTML-Codes direkt auf Memcache (weil einige Django-Vorlage Tags sind sehr langsam ebenfalls). indem ich dies tue multiplizierte ich das r/s * 100 – surfeurX

0

Sie könnten Memcached-Leistung untersuchen.

$ python manage.py shell 
>>> from django.core.cache import cache 
>>> cache.set("unique_key_name_12345", "some value with a size representative of the real world memcached usage", timeout=3600) 
>>> from datetime import datetime 
>>> def how_long(n): 
     start = datetime.utcnow() 
     for _ in xrange(n): 
      cache.get("unique_key_name_12345") 
     return (datetime.utcnow() - start).total_seconds() 

Mit dieser Art von Round-Trip-Test Ich sehe, dass 1 Memcached-Lookup wird etwa 0,2 ms auf meinem Server nehmen.

Das Problem mit django.core.cache und pylibmc ist, dass die Funktionen blockieren. Möglicherweise könnten Sie die 50-fache dieser Anzahl in der Rundreise für HTTP-Anforderung erhalten. 50 mal 0,2 ms sind schon 10 ms.

Wenn Sie bei 4 Arbeitern ohne memcached 1200 req/s erreichen, beträgt die durchschnittliche HTTP-Umlaufzeit 1/(1200/4) = 3,33 ms. Fügen Sie 10 ms hinzu und es wird 13,33 ms. Der Durchsatz mit 4 Arbeitern würde auf 300 req/s fallen (was zufällig im Ballpark Ihrer 157 Nummer ist).

Verwandte Themen