My Django=本番環境でのアプリケーションの痛みは非常に遅くなりました。おそらく、複雑またはインデックス化されていないクエリが原因です。
アプリケーションをプロファイルするDjango風の方法はありますか?
Django Debug Toolbar を試してください。各ページで実行されるクエリとそれらにかかる時間を示します。本当に便利で、強力で使いやすいツールです。
また、ドキュメントからDjangoのパフォーマンス データベースアクセスの最適化 に関する推奨事項をお読みください。
Django performance tips by Jacob Kaplan-Moss。
グーグルで「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
データアクセスのプロファイリング(ボトルネックが最も多い場所)については、 Django-live-profiler を確認してください。 Django Debug Toolbar)とは異なり、すべてのリクエストにわたって同時にデータを収集し、パフォーマンスのオーバーヘッドが過度になったり、アプリの内部を公開したりせずに本番環境で実行できます。
ここで恥知らずなプラグインですが、私は最近この目的のために https://github.com/Django-silk/silk を作りました。 Djangoツールバーに似ていますが、履歴、コードプロファイリング、すべてを細かく制御できます。
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を使用しました。
しかし、他のオプションもあります:
ビューがHTMLではない場合(JSONなど)、プロファイリングには単純なミドルウェアメソッドを使用します。
次に例を示します。
https://Gist.github.com/1229685 -すべてのsql呼び出しをキャプチャしてビューに入りました
https://Gist.github.com/1229681 -ビューの作成に使用されるすべてのメソッド呼び出しをプロファイルする