Domanda

La mia applicazione è in esecuzione su Google App Engine e la maggior parte delle richieste ottiene costantemente bandiera gialla a causa dell'elevato utilizzo della CPU. Usando il profiler ho rintracciato il problema fino alla routine di creazione dell'istanza jinja2.Environment .

Sto creando l'istanza a livello di modulo:

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

A causa della modalità operativa Google AppEngine (CGI), questo codice può essere eseguito su ogni singola richiesta (la loro cache di importazione del modulo sembra memorizzare i moduli per secondi anziché per minuti).

Stavo pensando di archiviare l'istanza di ambiente in memcache, ma sembra non essere selezionabile. L'istanza FileSystemLoader sembra essere selezionabile e può essere memorizzata nella cache, ma con questo approccio non ho riscontrato alcun miglioramento sostanziale nell'uso della CPU.

Qualcuno può suggerire un modo per ridurre il sovraccarico di creazione dell'istanza jinja2.Environment ?

Modifica : di seguito è parte (pertinente) dell'output del profiler.

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

Una chiamata, ma per quanto posso vedere (e questo è coerente in tutte le mie app basate su GAE), la più costosa dell'intero ciclo di elaborazione delle richieste.

È stato utile?

Soluzione

Armin ha suggerito di precompilare i modelli Jinja2 in codice Python e di utilizzare i modelli compilati in produzione. Quindi ho creato un compilatore / caricatore per questo, e ora rende alcuni modelli complessi 13 volte più veloci, eliminando tutto il sovraccarico di analisi. La discussione correlata con link al repository è qui .

Altri suggerimenti

OK, gente, questo è quello che ho ricevuto oggi su #pocoo:

[20:59] zgoda: ciao, vorrei sapere se potevo ottimizzare il mio processo di creazione dell'ambiente jinja2, il problema - > Ottimizzazione della creazione dell'ambiente Jinja2

[21:00] zgoda: ho un profiler in uscita da "cold" app - > http://paste.pocoo.org/show/107009/

[21:01] zgoda: e per " hot " - > http://paste.pocoo.org/show/107014/

[21:02] zgoda: mi chiedo se potrei in qualche modo abbassare il costo della CPU per creare un ambiente per "freddo"; richieste

[21:05] mitsuhiko: zgoda: metti la creazione env in un modulo che importi

[21:05] mitsuhiko: come

[21:05] mitsuhiko: da yourapplication.utils import env

[21:05] zgoda: è già lì

[21:06] mitsuhiko: hmm

[21:06] mitsuhiko: penso che il problema sia che il modello viene ricompilato ad ogni accesso

[21:06] mitsuhiko: sfortunatamente gae è incredibilmente limitato, non so se c'è molto che posso fare attualmente

[21:07] zgoda: ho provato con jinja bytecache ma non funziona su prod (è sul server di sviluppo)

[21:08] mitsuhiko: lo so

[21:08] mitsuhiko: l'appengine non ha il maresciallo

[21:12] zgoda: mitsuhiko: grazie

[21:13] zgoda: speravo di fare qualcosa di sbagliato e questo può essere ottimizzato ...

[21:13] mitsuhiko: zgoda: la prossima versione arriverà con un miglior supporto dell'appengine, ma non sono ancora sicuro di come implementare una migliore memorizzazione nella cache per ae

Sembra che Armin sia a conoscenza dei problemi con la memorizzazione nella cache bytecode su AppEngine e ha alcuni piani per migliorare Jinja2 per consentire la memorizzazione nella cache su GAE. Spero che le cose andranno meglio nel tempo.

scroll top