2010-11-06 20 views
6

Einige Profiling zeigt Vorlage Rendern als der Täter. (Ich versuche auf einer Seite mit NUR zwischengespeicherten Abfragen.) Aber immer noch ist die Vorlage sehr einfach. der komplexeste Teil ist eine verschachtelte Schleife, die 10 Mal ausgeführt wird, aber wenn alles gut läuft, wird die verschachtelte Schleife nicht ausgeführt, weil sie zwischengespeichert ist. (Wie in meinem Test)django ist sehr langsam

, das ist

{% for p in posts %} 
--{{p.by.username}} 
--{{p.text}} 
{% cache 600 p p.timestamp %} 
    {% for img in p.images.all %} 
     --{{img.path}} 
    {% endfor %} 
{% endcache %} 
{% endfor %} 

ich ~ 80 req/s auf dem dev. Server für diese Seite. (Ich habe festgestellt, dass ich diese Zahl in der Produktion mit 3 multiplizieren kann) Für einen Vergleich bekomme ich 1000 req/s für eine triviale Vorlage, die nur eine kurze statische Zeichenfolge enthält.

Ist das ein bekanntes Problem? Wie gehe ich vor, es zu korrigieren/zu vermeiden?

+0

Was genau ist "langsam"? –

+0

80 req/s ist langsam. weil ich nichts mache, wenn nicht ein paar Memcache. – oscar

+0

Keine Antwort, sondern ein Vorschlag. Haben Sie versucht, Caching wie hier: http://djangosnippets.org/snippets/507/ –

Antwort

2

(Offenbar bin ich nicht „karmischen“ genug um Kommentare zu schreiben noch, oder ich würde dies als einen Kommentar schreiben, anstatt eine Antwort)

Könnten Sie erarbeiten, was Sie unter „NUR im Cache-Abfragen“ bedeuten?

Abgesehen davon, es scheint mir, dass Ihr Problem könnte sein, dass Sie schlagen Ihre Datenbank viel während Vorlage Rendering.

{% for p in posts %} 
--{{p.by.username}} {# 1 #} 
--{{p.text}} 
{% cache 600 p p.timestamp %} 
    {% for img in p.images.all %} {# 2 #} 
     --{{img.path}} 
    {% endfor %} 
{% endcache %} 
{% endfor %} 

Sie liefern "Beiträge" zu Ihrer Vorlage; Das ist eine Abfrage, von der Sie gesagt haben, dass sie 100 Ergebnisse enthält.

Für jede Iteration über Beiträge, dann, schlagen Sie die Datenbank bei {# 1 #}, um p.by, die ich vermute, ein ForeignKey zu einem auth.User zu sein.

Darüber hinaus, mit einem ungültigen Cache (erster Lauf), schlagen Sie die db erneut um {# 2 #}, um die Liste der Bilder dieses Beitrags zu erhalten.

Also für 100 Elemente, schlagen Sie die Datenbank 201 mal pro Anfrage für einen ersten Lauf und 101 mit einem gefüllten Cache für die Bilder-Schleife.

Versuchen Sie, select_related mit Ihrer Posts-Abfrage zu verwenden, um diese zusätzlichen Ergebnisse auf die eine Abfrage zu ziehen, wenn möglich. Etwas wie posts = Post.objects.select_related('by', 'images').filter(...) könnte den Trick machen, obwohl ich weiß, select_related hat Grenzen, wenn es darum geht, Fremdschlüssel und m2m Felder umzukehren (es funktioniert möglicherweise nicht für die Bilder, abhängig von Ihrer Modellstruktur).

+0

Ich verwende select_related bereits, wenn die Abfrage nicht zwischengespeichert wird, aber wie ich schon sagte, in diesem Fall ziehe ich nur die Ergebnisse von memcached. - Also, die Debug-Symbolleiste zeigt 0 Abfrage ausgeführt. – oscar

+0

Auch ich sagte, es hat 10 Ergebnisse, nicht 100. – oscar

+0

Es war in einem Kommentar, dass Sie "100 Schleifen" sagten; Ich habe die 10 Punkte, die Sie in Ihrer Frage erwähnt haben, so interpretiert, dass die innere Bilderschleife für jeden Beitrag zehn Mal durchlaufen wird. Entschuldigung, wenn ich falsch verstanden habe. – eternicode