Django, niedrige Anfragen pro Sekunde mit Gunicorn 4 Arbeiter

9

Ich versuche zu sehen, warum meine Django-Website (Gunicorn 4 workers) langsam ist unter Schwerlast, ich habe einige Profilerstellungen gemacht Ссылка ohne eine klare Antwort, also habe ich einige Lasttests von Grund auf mit ab -n 1000 -c 100 http://localhost:8888/

gestartet

Eine einfache Httpreponse ("Hallo Welt") keine Middleware == & gt; 3600req / s

Eine einfache Httpreponse ("Hallo Welt") mit Middlewares (zwischengespeicherte Sitzung, zwischengespeicherte Authentifizierung) == & gt; 2300req / s

Eine einfache render_to_response, die nur ein Formular (zwischengespeicherte Vorlage) ausgibt == & gt; 1200 req / s (Antwortzeit wurde durch 2 geteilt)

Eine einfache render_to_response mit 50 Memcache-Abfragen == & gt; 157req / s

Memcache-Abfragen sollten viel schneller sein als das (ich verwende PyLibMCCache)? Läuft das Rendern der Vorlage so langsam?

Ich habe verschiedene Profiliertechniken ohne Erfolg ausprobiert.

%Vor%

Ich benutze Ubuntu 12.04 (6Go von RAM, Core i5)

Irgendwelche Hilfe bitte?

    
surfeurX 05.03.2013, 10:42
quelle

2 Antworten

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, wenn die Anfrage beendet ist), sowohl Ihr Arbeiter als auch memcached können viel mehr Stress bewältigen, aber natürlich auch dauert 5 / 10ms, um einen memcached Anruf zu tun, dann werden 50 von ihnen der Flaschenhals sein, da Sie die Netzwerklatenz multipliziert mit Anrufanzahl haben.

Im Moment 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 Ihre Anwendung verlangsamt, hängt sehr wahrscheinlich mit der Art und Weise zusammen, wie Sie Ihre db und memcached verwenden (und vielleicht beim Rendern von Vorlagen).

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

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.

    
Tommaso Barbugli 09.03.2013 13:40
quelle
0

Sie könnten die Memcached-Leistung untersuchen.

%Vor%

Bei dieser Art von Round-Trip-Test sehe ich, dass 1 Memcached-Lookup auf meinem Server etwa 0,2 ms dauert.

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).

    
Freek Wiekmeijer 29.01.2014 13:46
quelle