Optimierung der Jinja2 Umfeldschöpfung

Meine Anwendung läuft auf Google App Engine und die meisten Anfragen werden ständig gelbe Flagge wegen hoher CPU-Auslastung. Mit profiler Ich verfolgte das Problem auf die Routine der Erstellung von jinja2.Environment Instanz.

Ich schaffe die Instanz auf Modulebene:

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

Aufgrund des Google AppEngine-Betriebsmodus (CGI) kann dieser Code auf jede Anfrage ausgeführt werden (ihr Modulimport-Cache scheint Module für Sekunden und nicht für Minuten zu cache).

Ich dachte daran, die Umgebungsinstanz in Memcache zu speichern, aber es scheint nicht pflichtig zu sein. FileSystemLoader Instanz scheint picklabel zu sein und kann zwischengespeichert werden, aber ich habe keine wesentliche Verbesserung der CPU-Nutzung mit diesem Ansatz beobachtet.

Jeder kann vorschlagen, einen Weg, um den Overhead der Erstellung von jinja2.Environment Instanz zu verringern?

Bearbeiten : unten ist (relevant) Teil der Profilerausgabe.

 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 das ist konsistent über alle meine GAE-basierten Apps), die teuersten in der gesamten Anfrage Verarbeitung Zyklus.

3 Solutions collect form web for “Optimierung der Jinja2 Umfeldschöpfung”

Armin schlug vor, Jinja2-Vorlagen zu python-Code vorzuarbeiten und die kompilierten Vorlagen in der Produktion zu verwenden. Also habe ich einen Compiler / Loader dafür gemacht, und es macht jetzt einige komplexe Vorlagen 13 mal schneller und wirft alle Parsing Overhead. Die damit verbundene Diskussion mit Link zum Repository ist hier .

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

[20:59] zgoda: Hallo, ich würde gerne wissen, ob ich meinen jinja2 Umgebungsschaffungsprozess optimieren könnte, das Problem -> Optimierung der Jinja2 Umfeldschöpfung

[21:00] 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, ob ich die CPU-Kosten für die Erstellung von Umwelt für "kalte" Anfragen etwas senken könnte

[21:05] mitsuhiko: zgoda: Setzen Sie die env-Erstellung in ein 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 neu kompiliert wird jeder Zugriff

[21:06] mitsuhiko: leider ist gae unglaublich begrenzt, ich weiß nicht, ob es viel gibt, was ich momentan tun kann

[21:07] zgoda: Ich habe versucht mit jinja bytecache aber es funktioniert nicht auf prod (seine on on dev server)

[21:08] mitsuhiko: Ich weiß

[21:08] Mitsuhiko: Appengine hat keinen Marschall

[21:12] zgoda: mitsuhiko: danke

[21:13] zgoda: Ich hatte gehofft, dass ich etwas falsch mache und das kann optimiert werden …

[21:13] mitsuhiko: zgoda: nächste Version wird mit verbesserter Appengine-Unterstützung kommen, aber ich bin mir noch nicht sicher, wie man ein besseres Caching für ae implementiert

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

Nach diesem Google Rezept können Sie Memcache verwenden, um Bytecodes zu cache. Sie können auch den Inhalt der Vorlagendatei selbst zwischenspeichern. Alles im selben Rezept

  • Setzen Sie Javascript an der Einstellungsdatei in Jinja 2 ein
  • Überprüfen Sie, ob Schlüssel in einem Python-Dikt in Jinja2-Vorlagen vorhanden ist
  • Warum diese HTML-Vorlage auf jinja2 / python produziert 'u ()' Tupel-Fehler in String-Substitution?
  • Jinja2 kompilieren Erweiterung nach beinhaltet
  • Schleife über eine Liste in einer Jinja2-Vorlage
  • Unterdrückung "Keine" Ausgabe als String in Jinja2
  • Streifen Whitespace in generierten HTML mit reinen Python-Code
  • Python: Wie formatiere ich ein Date in Jinja2?
  • Importieren Sie ein Python-Modul in eine Jinja-Vorlage?
  • Kompilieren Sie den Unterabschnitt von Jinja2 AST
  • Ansible Schreibvariablen in YAML-Datei
  • Python ist die beste Programmiersprache der Welt.