Pythonpaster serve app.ini
は、最初のリクエストの準備ができているよりも時間がかかっています。
ミドルウェアを使用してリクエストをプロファイリングする方法を知っていますが、初期化時間をプロファイリングするにはどうすればよいですか?スレッドプールをフォークせず、提供する準備ができたらすぐに終了して、準備ができてからの時間がプロファイルに表示されないようにしたいと思います。
Pythonpaster serve app.ini
は、最初のリクエストの準備ができているよりも時間がかかっています。
ミドルウェアを使用してリクエストをプロファイリングする方法を知っていますが、初期化時間をプロファイリングするにはどうすればよいですか?スレッドプールをフォークせず、提供する準備ができたらすぐに終了して、準備ができてからの時間がプロファイルに表示されないようにしたいと思います。
一般に、あなたの方法論は、コードのセクションの周りでタイミングブロックを実行してから、ロギングステートメントを発行することです。初期化後のシャットダウンに関しては、私はあなたが使用しているものの詳細に精通していません。
編集:私はこのミドルウェアを使用して、パフォーマンスの陥没穴を見つけるのに役立てました。現在はwerkzeugミドルウェアですが、用途に合わせて調整できる場合があります。それが役に立てば幸い
import re
re_profile = re.compile(ur'(^|&|\?)prof($|=|&)')
class ProfilerMiddleware(BaseProcessor):
def process_runner(self, runner, environ):
self.profiler = None
if (environ['REMOTE_ADDR'] in settings_static.internal_ips or settings_static.local_server) and re_profile.match(environ['QUERY_STRING']):
self.profiler = cProfile.Profile()
def wrap(*args, **kwargs):
return self.profiler.runcall(runner, *args, **kwargs)
return wrap
def process_response(self, request, response):
if self.profiler:
self.profiler.create_stats()
out = StringIO.StringIO()
old_stdout, sys.stdout = sys.stdout, out
#from dozer.profile import buildtree, write_dot_graph
#write_dot_graph(self.profiler.getstats(), buildtree(self.profiler.getstats()), "/tmp/output.gv")
self.profiler.print_stats(1)
sys.stdout = old_stdout
response.response = [u'<pre>%s</pre>' % to_unicode(out.getvalue())]
response.content_type = 'text/html'
プロファイリングしたとしても、最適化のヒントが得られるとは思えません。
mod_wsgi セットアップ内で Paster を使用し、起動時間を軽減してユーザーがそれに悩まされないようにし、たとえば toscawidgets が適切にセットアップされていることを確認するために、次のようにします。
app = paste.fixture.TestApp(application)
# TODO-dir: FIXME, must go away!
try:
app.get("/")
except:
pass
ここでのアプリケーションは、もちろん、初期化/ロードされた貼り付けアプリです。
私はほとんどの場合paster serve --reload ...
、開発中に使用します。subprocess
そのコマンドは、それ自体をサブプロセスとして実行します ( ではなく、モジュールを使用して独自のスクリプトを実行しますfork()
)。
サブプロセスは、ソース コードの変更をポーリングし、変更を検出すると終了し、親によって再起動されpaster serve --reload
ます。
つまり、自分自身をプロファイリングする場合は、引数paster serve
を省略してください。--reload
ミドルウェアを使用した個々のリクエストのプロファイリングは、どちらの方法でも問題なく機能するはずです。
私の特定の問題は、pkg_resources
最初に呼び出されたときに、インストールされているすべてのパッケージに比例して時間がかかることでした。不要なパッケージを使用せずに virtualenv を再構築することで解決しました。