web-dev-qa-db-ja.com

プロファイリングDjango

My Django=本番環境でのアプリケーションの痛みは非常に遅くなりました。おそらく、複雑またはインデックス化されていないクエリが原因です。

アプリケーションをプロファイルするDjango風の方法はありますか?

92
sharjeel

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

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

Django performance tips by Jacob Kaplan-Moss。

73
Silver Light

グーグルで「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の hotshot モジュールを使用します:

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

編集:SQLクエリのプロファイリング用 http://github.com/robhudson/Django-debug-toolbar Konstantinによる言及は素晴らしいことですが、クエリが本当に遅い場合(おそらく数百または数千があるため) )、ブラウザに読み込まれるまで非常に長い時間待機します。その後、速度が遅いために閲覧が困難になります。また、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
28

データアクセスのプロファイリング(ボトルネックが最も多い場所)については、 Django-live-profiler を確認してください。 Django Debug Toolbar)とは異なり、すべてのリクエストにわたって同時にデータを収集し、パフォーマンスのオーバーヘッドが過度になったり、アプリの内部を公開したりせずに本番環境で実行できます。

Check out this screenshot

16
atereshkin

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

13
Michael

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を使用しました。

しかし、他のオプションもあります:

5

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

次に例を示します。

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

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

3
Evgeny