Djangoのプロファイリング


98

私のdjangoアプリケーションは、本番環境でひどく遅くなっています。おそらく、いくつかの複雑なクエリやインデックス付けされていないクエリが原因です。

アプリケーションをプロファイルするジャンゴっぽい方法はありますか?

回答:


77

Django Debug Toolbarをお試しください 。各ページで実行されるクエリと、それらにかかる時間を示します。本当に便利でパワフルで使いやすいツールです。

また、データベースアクセスの最適化の Djangoパフォーマンスに関する推奨事項もご覧ください。ドキュメントから、。

そして、Djangoのパフォーマンスのヒントジェイコブ・カプラン・モスによります。


13
Django Debug Toolbarに注意してください。開発中はオフにしました。私の(確かに低電力の)ラップトップでは、ページのレンダリングが大幅に高速でした。開発サーバーを調べて、ダウンロードしているデータの量を確認してください。
ドミニクロジャー

2
django-debug-toolbarは、django-ormがdbにヒットするクエリの数を確認するのに役立ちます。select_related()関数がヒットするトリックを減らす方法を確認できます。
panchicore

11
@ dominic-rodgerデバッグツールバーの処理速度がどれほど遅いかわかりませんでした。SQLクエリは小さかった(30ms)が、CPU時間は非常に高かった(800ms)。私が調整していた別のページでは、SQL時間が300ミリ秒、CPU時間が8000ミリ秒でした。そのため、問題の原因を探し続けました。Django Toolbarをオフにすると、すぐにスピードアップします。3年後、まだ関連性があります。
エステバン2013年

2
@Esteban、このコメントをたくさんありがとう、私は文字通り途方もなく高いCPU時間をめちゃくちゃにしていたとdhangoツールバーが引き受けました。djangoプロファイリングでは、CPU時間は約30秒でしたが、削除すると1.5秒になりました!!
noob Mama

28

グーグルで「django-profiling」と入力するだけで、次のリンク(およびその他)が表示されます。

http://code.djangoproject.com/wiki/ProfilingDjango

http://code.google.com/p/django-profiling/

http://www.rkblog.rk.edu.pl/w/p/django-profiling-hotshot-and-kcachegrind/

個人的に私はミドルウェアアプローチを使用しています。つまり、各ユーザーはセッションに格納された「プロファイリング」フラグを切り替えることができ、プロファイリングミドルウェアがフラグが設定されていることに気付いた場合、次のようなPythonのホットショットモジュールを使用します。

def process_view(self, request, view_func, view_args, view_kwargs):

     # setup things here, along with: settings.DEBUG=True 
     # to get a SQL dump in connection.queries

     profiler = hotshot.Profile(fname)
     response = profiler.runcall(view_func, request, *view_args, **view_kwargs)
     profiler.close()

     # process results

     return response

編集:Konstantinが言及したhttp://github.com/robhudson/django-debug-toolbarの SQLクエリをプロファイリングするのは良いことですが、クエリが本当に遅い場合(おそらく数百または数千あるため)、 「ブラウザに読み込まれるまで非常に長い時間待機します。その後、処理速度が遅いため、閲覧が困難になります。また、django-debug-toolbarは、設計上、AJAXリクエストの内部について有用な洞察を与えることができません。

EDIT2:django-extensionsは、優れたプロファイリングコマンドが組み込まれています。

https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst

これを実行して、ほら:

$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data

7
code.google.com/p/django-profileは、ユーザープロファイルのdjangoアプリケーションです。djangoのプロファイリングとしては使用されません:)
dzen

1
@dzen:ほら、良い点、それがあることを意味しました:code.google.com/p/django-profiling :-)
トマスツ・ジーリンスキー

1
実行後にプロファイラーダンプを読み取る方法について疑問がある場合はpython manage.py runprofileserver --prof-path=/path/to/dir、次のブログに従ってください:darkcoding.net/software/profiling-django-for-cpu-bound-apps
ニア2014年

ああ、はい、私のお気に入り、Googleを使用して私のクエリに対する上位の回答の1つを見つけることは、「Googleがここにアクセスするためにググったものをググる」ことです
Anna

hotshotはPython 3で非推奨になり削除されているため、この回答とProfilingDjangoWikiページは20202
Patryk Bratkowski

16

データアクセスのプロファイリング(ボトルネックがほとんどの場合)については、django-live-profilerをチェックしてください。Django Debug Toolbarとは異なり、すべてのリクエストのデータを同時に収集し、パフォーマンスのオーバーヘッドをあまり増やしたり、アプリの内部を公開したりせずに、本番環境で実行できます。

このスクリーンショットをチェックしてください


18
1.6以上をサポートしていません。1年以上アクティビティがありません。
Han He

14

ここでは恥知らずなプラグインですが、最近この目的のためにhttps://github.com/django-silk/silkを作成しました。これはdjangoツールバーにいくらか似ていますが、履歴、コードプロファイリング、およびすべてに対するより詳細な制御を備えています。


ミドルウェアの問題「ロガー "silk.middleware"のハンドラーが見つかりませんでした」
Naveen Agarwal


5

KCacheGrindのすべてのファンにとって、Djangoの素晴らしいテストと組み合わせてシェルを使用するのは非常に簡単だと思います Client、特に本番プロファイルログをオンザフライで生成するためのです。このテクニックは軽いタッチを持っているので、何度か使用しています。厄介なミドルウェアやサードパーティのDjangoアプリケーションは必要ありません。

たとえば、実行速度が遅いと思われる特定のビューのプロファイルを作成するには、シェルを開いて次のコードを入力します。

from django.test import Client
import hotshot

c = Client()
profiler = hotshot.Profile("yourprofile.prof")  # saves a logfile to your pwd
profiler.runcall(c.get, "/pattern/matching/your/view/")
profiler.close()

結果のログを視覚化するために、hotshot2cachegrindを使用しました。

ただし、他のオプションもあります。


3

ビューがHTMLではない場合(JSONなど)、プロファイリングには単純なミドルウェアメソッドを使用します。

次に例をいくつか示します。

https://gist.github.com/1229685-ビューに入ったすべてのSQL呼び出しをキャプチャします

https://gist.github.com/1229681-ビューの作成に使用されるすべてのメソッド呼び出しのプロファイル


0

最近Djangoアプリのプロファイルを作成する必要があり、これらの提案の多くを試しました。代わりpyinstrumentを使用しまし。これはミドルウェアリストを1回更新するだけでDjangoアプリに追加でき、タイミングのスタックベースのビューを提供します。

他のいくつかのツールでの私の経験の簡単な要約:

  • Djangoデバッグツールバーは、SQLクエリが原因で問題が発生した場合に最適であり、pyinstrument
  • django-silkはうまく機能しますが、サブリクエストのタイミングが必要なスタックの各部分にコンテキストマネージャまたはデコレータを追加する必要があります。また、cProfileタイミングにアクセスする簡単な方法を提供し、ajaxタイミングを自動的に表示します。どちらも非常に役立ちます。
  • djdt-flamegraphは有望に見えましたが、ページが実際にシステムにレンダリングされたことはありません。

私が試した他のツールと比較して、pyinstrumentインストールと使用は劇的に簡単でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.