Профилировщик промежуточного ПО App Engine WSGI

У меня есть приложение Django, которое я решил перенести в Google App Engine.
Я решил использовать NDB в качестве своей базы данных и перенес все модели (включая пользователя django). После одной недели чтения документации (документация App Engine ужасна, приведенные примеры часто устарели и больше не работают) и переноса приложения, когда я запускал его, оно было очень медленным: задержка 1-2 секунды с пустым к базе данных.
Запросы ndb не занимают много времени (менее 50 мс), а Appstats больше ничего не показывает.
Я решил использовать cProfile и создал промежуточное ПО wsgi, но я не могу понять, как распечатать вывод. Методы, которые дает мне pstats, либо распечатывают выходные данные, либо сохраняют их в файл, и я не могу ничего сделать внутри обработчика 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)

Как я могу добавить статистику профилировщика в тело?
Или есть лучший способ узнать, что замедляет работу моего приложения?
Я использую много импорта модулей в представлениях django. Есть ли приложение? Engine способ импортировать модули?


person andrei    schedule 17.08.2012    source источник
comment
Я очистил свои URL-адреса и представления django и оставил только одно представление с сообщением Hello World, и оно имеет задержку 500-1 с, что все еще много для сообщения Hello World.   -  person andrei    schedule 17.08.2012


Ответы (3)


Уже есть замечательное приложение WSGI, которое вы можете легко интегрировать в свой проект под названием google-app-engine-mini-profiler.

gae_mini_profiler — это быстро подключаемое приложение WSGI, которое обеспечивает повсеместное профилирование ваших существующих проектов GAE. Он предоставляет как статистику RPC, так и стандартные выходные данные профилирования для выбранных вами пользователей на вашем рабочем сайте. Будут профилированы только запросы, поступающие от выбранных вами пользователей, а другие не пострадают от снижения производительности.

Пожалуйста, ознакомьтесь с этим сообщением в блоге автора Бена. Kamens или перейдите прямо в репозиторий.

person systempuntoout    schedule 17.08.2012
comment
Спасибо! Это лучше, чем то, что я хотел. Надеюсь, я найду, что тормозит мое приложение. - person andrei; 17.08.2012
comment
Кажется, что 579 мс из 965 мс используются системой шаблонов django. {метод «чтение» объектов «файл»} 303,44 мс и {открытие} 275,57 мс. Я понятия не имею, как это оптимизировать. - person andrei; 17.08.2012

Во-первых, я не думаю, что cProfile будет работать, поскольку это библиотека C.

Когда вы обойдете это, самое простое, что я могу придумать, это вывести данные вашего профилировщика в журнал.

import logging
logging.info("timing info")

1-2 секунды не являются чем-то необычным для запроса на запуск, например, если App Engine должен запустить новый экземпляр для обработки вашего запроса. В журналах будет указано, какие запросы являются запросами на запуск.

Если вы выполняете много запросов, и они все еще занимают много времени, значит, где-то в вашем коде есть проблема.

person dragonx    schedule 17.08.2012
comment
Запрос на запуск занимает гораздо больше времени (10 секунд). Он остается постоянным 1-2 секунды, независимо от того, сколько запросов я отправляю. - person andrei; 17.08.2012

вы должны использовать appstats. этот инструмент создан именно для этого. https://developers.google.com/appengine/docs/python/tools/appstats

person aschmid00    schedule 17.08.2012
comment
Как я уже сказал, я использовал appstats, но он показывает только запросы к хранилищу данных и ничего более. - person andrei; 17.08.2012