문제

내 응용 프로그램은 Google App Engine에서 실행 중이며 CPU 사용량이 높기 때문에 대부분의 요청은 지속적으로 노란색 플래그를 얻습니다. Profiler를 사용하여 문제를 생성 루틴으로 추적했습니다. jinja2.Environment 사례.

모듈 레벨에서 인스턴스를 만들고 있습니다.

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

CGI (Google AppEngine Operation Mode)로 인해이 코드는 각 요청에 따라 실행될 수 있습니다 (모듈 가져 오기 캐시는 몇 분 동안 몇 초 동안 모듈을 캐시하는 것 같습니다).

환경 인스턴스를 Memcache에 저장하는 것에 대해 생각하고 있었지만 선택할 수없는 것 같습니다. FileSystemLoader 인스턴스는 선택 가능한 것으로 보이고 캐시 될 수 있지만이 접근법으로 CPU 사용량의 실질적인 개선을 관찰하지 못했습니다.

누구나 생성의 오버 헤드를 줄이는 방법을 제안 할 수 있습니다. jinja2.Environment 사례?

편집하다: 아래는 프로파일 러 출력의 (관련) 부분입니다.

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

한 번의 전화, 그러나 지금까지 볼 수 있습니다 (그리고 이것은 모든 GAE 기반 앱에서 일관성이 있습니다). 전체 요청 처리주기에서 가장 비쌉니다.

도움이 되었습니까?

해결책

Armin은 Jinja2 템플릿을 Python 코드로 사전 컴파일하고 프로덕션에서 컴파일 된 템플릿을 사용하도록 제안했습니다. 그래서 컴파일러/로더를 만들었고 이제 복잡한 템플릿을 13 배 더 빨리 렌더링하여 버려줍니다. 모두 구문 분석 오버 헤드. 리포지토리 링크와 관련된 관련 논의는 다음과 같습니다 여기.

다른 팁

좋아, 사람들, 이것은 #pocoo에서 오늘 내가 얻은 것입니다.

20:59] Zgoda : 안녕하세요, Jinja2 환경 생성 프로세스, 문제 ->를 최적화 할 수 있는지 알고 싶습니다. Jinja2 환경 생성 최적화

21:00] Zgoda : "Cold"앱에서 프로파일 러 출력 -> http://paste.pocoo.org/show/107009/

21:01] Zgoda : 그리고 "뜨거운" -> http://paste.pocoo.org/show/107014/

21:02] Zgoda : "Cold"요청에 대한 환경 생성의 CPU 비용을 약간 낮출 수 있는지 궁금합니다.

21:05] Mitsuhiko : Zgoda : ENV 제작을 가져 오는 모듈에 넣습니다.

21:05] Mitsuhiko : 좋아요

21:05] Mitsuhiko : yourapplication.utils import env

21:05] Zgoda : 이미 거기에 있습니다

21:06] Mitsuhiko : 흠

21:06] Mitsuhiko : 문제는 템플릿이 각 액세스마다 재 컴파일된다는 것입니다.

21:06] Mitsuhiko : 불행히도 Gae는 엄청나게 제한되어 있습니다. 현재 할 수있는 일이 많는지 모르겠습니다.

21:07] Zgoda : Jinja Bytecache와 함께 시도했지만 Prod (on on on dev server)에서는 작동하지 않습니다.

21:08] Mitsuhiko : 알고 있습니다

21:08] Mitsuhiko : Appengine은 마샬이 없습니다.

21:12] Zgoda : Mitsuhiko : 감사합니다

21:13] Zgoda : 나는 뭔가 잘못하고 있기를 바랐고 이것이 최적화 될 수 있습니다 ...

21:13] Mitsuhiko : Zgoda : 다음 릴리스가 개선 된 Appengine 지원이 제공 될 예정이지만 AE의 개선 된 캐싱을 구현하는 방법은 아직 확실하지 않습니다.

Armin은 Appengine의 바이트 코드 캐싱 문제를 알고 있으며 GAE의 캐싱을 허용하기 위해 Jinja2를 개선 할 계획이 있습니다. 시간이 지남에 따라 상황이 나아지기를 바랍니다.

이것에 따르면 Google 레시피 Memcache를 사용하여 바이트 코드를 캐시 할 수 있습니다. 템플릿 파일 컨텐츠 자체를 캐시 할 수도 있습니다. 모두 같은 레시피에서

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top