2

GoogleAppEngineに移植することにしたDjangoアプリケーションがあります。
データベースとしてNDBを使用することにし、すべてのモデル(djangoユーザーを含む)を移植しました。ドキュメントを1週間読んだ後(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ビューで多くのモジュールインポートを使用していますモジュールをインポートするAppEngineの方法はありますか?

4

3 に答える 3

3

google-app-engine-mini-profilerと呼ばれるプロジェクトに簡単に統合できる素晴らしいWSGIアプリケーションがすでにあります。

gae_mini_profilerは、既存のGAEプロジェクトのユビキタスプロファイリングを提供するクイックドロップインWSGIアプリです。実稼働サイトで選択したユーザーに対して、RPC統計と標準プロファイリング出力の両方を公開します。選択したユーザーからのリクエストのみがプロファイリングされ、他のユーザーはパフォーマンスの低下を被ることはありません。

著者のBenKamensによるこのブログ投稿をご覧になるか、リポジトリに直接アクセスしてください。

于 2012-08-17T13:22:30.650 に答える
1

まず、cProfileはCライブラリであるため、機能しないと思います。

それを回避するとき、私が考えることができる最も簡単なことは、プロファイラーデータをログに出力することです。

import logging
logging.info("timing info")

起動リクエストの場合、1〜2秒は異常ではありません。つまり、リクエストを処理するためにAppEngineが新しいインスタンスを起動する必要がある場合です。ログには、どのリクエストがスタートアップリクエストであるかが示されます。

多くのリクエストを実行していて、それでも時間がかかる場合は、コードのどこかに問題があります。

于 2012-08-17T15:57:58.980 に答える
0

appstatsを使用する必要があります。このツールはまさにこのために作られています。 https://developers.google.com/appengine/docs/python/tools/appstats

于 2012-08-17T13:11:29.673 に答える