Frage

Meine Anwendung läuft auf Google App Engine und die meisten Anfragen bekommt ständig gelbe Flagge wegen der hohen CPU-Auslastung. Mit Profiler verfolgen ich das Problem bis auf die Routine jinja2.Environment Instanz zu schaffen.

Ich schaffe die Instanz auf Modulebene:

from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS))

Durch die Google App Engine-Betriebsart (CGI), dieser Code kann auf jeder Anfrage ausgeführt werden (ihr Modul Import-Cache scheint Module für Sekunden zwischenzuspeichern und nicht für Minuten).

Ich dachte über die Umwelt-Instanz in memcache speichern, aber es scheint nicht picklable werden. FileSystemLoader Instanz scheint picklable zu sein und zwischengespeichert werden kann, aber ich habe keine wesentliche Verbesserung der CPU-Nutzung mit diesem Ansatz beobachten.

Jeder kann einen Weg vorschlagen, den Aufwand für die Erstellung jinja2.Environment Instanz zu verringern?

Bearbeiten :. Unten ist (relevant) Teil der Profiler-Ausgabe

222172 function calls (215262 primitive calls) in 8.695 CPU seconds

 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     33    1.073    0.033    1.083    0.033 {google3.apphosting.runtime._apphosting_runtime___python__apiproxy.Wait}
438/111    0.944    0.002    2.009    0.018 /base/python_dist/lib/python2.5/sre_parse.py:385(_parse)
   4218    0.655    0.000    1.002    0.000 /base/python_dist/lib/python2.5/pickle.py:1166(load_long_binput)
      1    0.611    0.611    0.679    0.679 /base/data/home/apps/with-the-flow/1.331879498764931274/jinja2/environment.py:10()

Ein Anruf, aber so weit ich sehen kann (und dies ist konsistent über alle meine GAE-basierten Anwendungen), die teuerste in dem gesamten Anforderungsverarbeitungszyklus.

War es hilfreich?

Lösung

Armin schlug Jinja2 Vorlagen Python-Code, und verwenden Sie die kompilierten Vorlagen in der Produktion vorge kompilieren. Also habe ich einen Compiler / loader für das gemacht, und es macht jetzt einige komplexen Vorlagen 13-mal schneller, Wegwerfen alle , um das Parsing-Overhead. Die damit verbundene Diskussion mit Link zum Repository ist hier .

Andere Tipps

OK, Leute, das ist, was habe ich heute auf #pocoo:

[20.59] zgoda: Hallo, ich möchte wissen, ob ich meine jinja2 Umgebung Erstellungsprozess optimieren könnte, das Problem -> Optimierung Jinja2 Umwelt Schaffung

[21.00 Uhr] zgoda: Ich habe Profiler Ausgabe von "kalt" app -> http: //paste.pocoo.org/show/107009/

[21.01] zgoda: und für "hot" -> http: // Paste. pocoo.org/show/107014/

[21.02] zgoda: Ich frage mich, wenn ich etwas die CPU Kosten für die Erstellung Umgebung für „kalt“ Anfragen senken könnte

[21.05] Mitsuhiko: zgoda: legen Sie die env Schöpfung in einem Modul, das Sie importieren

[21.05] Mitsuhiko: wie

[21.05] Mitsuhiko: von yourapplication.utils Import env

[21.05] zgoda: es ist schon da

[21.06] Mitsuhiko: hmm

[21.06] Mitsuhiko: Ich denke, das Problem ist, dass die Vorlage wird bei jedem Zugriff neu kompiliert

[21.06] Mitsuhiko: leider ist gae unglaublich beschränkt, ich weiß nicht, ob es gibt viel kann ich zur Zeit tun

[21.07] zgoda: Ich habe versucht, mit Jinja bytecache, aber es funktioniert nicht auf prod (sein auf auf dev-Server)

[21.08] Mitsuhiko: Ich weiß,

[21.08] Mitsuhiko: appengine nicht Marschall hat

[21.12] zgoda: Mitsuhiko: danke

[21.13] zgoda: Ich hatte gehofft, ich mache etwas falsch und diese optimiert werden kann ...

[21.13] Mitsuhiko: zgoda: nächste Version mit verbesserter appengine Unterstützung kommen wird, aber ich bin mir noch nicht sicher, wie für ae verbesserten Caching implementieren

Es sieht Armin von Problemen mit Bytecode-Caching auf AppEngine bewusst und hat einige Pläne Jinja2 zu verbessern Caching auf GAE zu ermöglichen. Ich hoffe, dass die Dinge im Laufe der Zeit besser werden.

Nach diesem google Rezepte können Sie memcache auf Cache-Bytecode verwenden. Sie können auch die Template-Datei Inhalt selbst zwischenspeichern. Alle im gleichen Rezept

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top