2012-08-17 1 views
1

Google App Engine으로 이식하기로 결정한 Django 애플리케이션이 있습니다.
데이터베이스로 NDB를 사용하기로 결정하고 모든 모델 (django 사용자 포함)을 포팅했습니다. 문서를 통해 1 주일을 읽은 후 (App Engine 설명서는 끔찍하며 주어진 예는 종종 오래되어 더 이상 작동하지 않습니다) 응용 프로그램을 포팅 한 후 실행했을 때 정말 느려졌습니다 : 1s-2s 대기 시간 데이터 베이스.
ndb 쿼리에 시간이 오래 걸리지 않고 (50ms 미만) 애플리케이션에 아무 것도 표시되지 않습니다. Appstats
cProfile을 사용하기로 결정하고 wsgi 미들웨어를 만들었지 만 출력물을 출력하는 방법을 알 수 없습니다. pstats 메소드는 출력물을 출력하거나 파일에 저장하기 때문에 wsgi 핸들러 내부에서는 아무 것도 할 수 없습니다.
내 코드는 다음과 같습니다App Engine WSGI 미들웨어 프로파일 러

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings") 
from django.core.handlers import wsgi 

from webob import Request 
class AppProfiler(object): 
    def __init__(self, app): 
     self.app = app 
    def __call__(self, environ, start_response): 
     from django.core.files.base import ContentFile 

     self.req = Request(environ) 
     import cProfile, pstats 
     prof = cProfile.Profile() 
     prof = prof.runctx("self.get_resp()", globals(), locals()) 

     print "<pre>" 
     stats = pstats.Stats(prof) 
     #stats.dump_stats(output) 
     stats.print_stats(80) 
     print "</pre>" 

     body = self.resp.body # here i should append the stats data 
     self.resp.body = body 

     return self.resp(environ, start_response) 

    def get_resp(self): 
     self.resp = self.req.get_response(self.app) 

app = wsgi.WSGIHandler() 
profiler = AppProfiler(app) 

어떻게 몸에 프로파일 통계를 추가 할 수 있습니까?
내 응용 프로그램의 속도를 줄이는 방법을 찾으려면 더 좋은 방법이 있습니까?
장고보기에서 많은 모듈 가져 오기를 사용하고 있는데 모듈을 가져 오는 App Engine 방식이 있습니까?

+0

장고 URL 및보기를 정리하고 하나의보기 만 Hello World 메시지로 남겨 둡니다.이 메시지는 500-1s 대기 시간을 갖습니다. 이는 안녕하세요 세계 메시지의 경우 많이 있습니다. – andrei

답변

2

구글 앱 엔진 미니 프로파일했다.

gae_mini_profiler 기존 GAE 프로젝트의 유비쿼터스 프로파일을 제공하는 빠른 드롭 WSGI 응용 프로그램입니다. 프로덕션 사이트 에서 RPC 통계 및 표준 프로파일 링 출력을 사용자에게 표시합니다. 사용자가 선택한의 요청 만 프로파일 링되고 나머지는 성능 저하가 없습니다 ( ).

주십시오, 저자 벤 Kamens하여이 blog post에 봐 또는 repo로 바로 이동합니다.

+1

고마워요! 그게 내가 원하는 것보다 낫다. 희망하는 것은 내 응용 프로그램을 끌어 내려고하는 것입니다. – andrei

+2

965ms 중 579ms가 장고 템플릿 시스템에서 사용 된 것으로 보입니다.{ 'file'객체를 '읽음'} 303.44ms 및 {open} 275.57ms. 이 방법을 최적화하는 방법에 대해서는 잘 모릅니다. – andrei

1

우선 C 라이브러리는 c 라이브러리이므로 cProfile이 작동하지 않을 것이라고 생각합니다.

내가 생각할 수있는 가장 간단한 방법은 프로파일 러 데이터를 로그에 출력하는 것입니다.

import logging 
logging.info("timing info") 

1-2초는 시작 요청에 대한 일반 밖으로 아니다 - 앱 엔진은 요청을 처리하기 위해 새로운 인스턴스를 시작해야하는 경우 즉. 로그에는 시작 요청 인 요청이 표시됩니다.

많은 요청을 실행 중이고 그 시간이 오래 걸리면 코드 어딘가에 문제가있는 것입니다.

+0

시작 요청이 훨씬 오래 걸립니다 (10 초). 얼마나 많은 요청을 보내더라도 1-2 초가 걸립니다. – andrei