2009-04-14 9 views
13

私はDjangoアプリのパフォーマンスをテストすることに興味がありますが、ラインごとのパフォーマンスデータを取得する最も良い方法は何ですか?ベンチマーキングdjangoアプリ

注::この検索は、ジャンゴ自体をベンチマークする多くの人を返します。私はdjangoのベンチマークを探していません、私は書いているdjangoのアプリケーションのパフォーマンスをテストしようとしています:)

ありがとう!

編集:私はちょうどボトルネックがこれに2つの層があります非常に細かいレベル

+0

「行単位のパフォーマンスデータ」を定義してください。 –

+0

申し訳ありませんが、コードごとの実行時間、機能、dbコールなどの時間を測定するだけです。 – Jiaaro

答えて

7

上にある場所を見つけるために、個々の機能、DBの呼び出しなどのタイミングを意味する「行ずつ」と。私たちはテストのために#1の大部分を持っています。私たちは#2を開始しようとしています。

  1. Djangoは隔離されています。通常のDjangoユニットテストはここでうまくいきます。少数(6未満)の「典型的な」ユースケースを循環するテストをいくつか作成します。これを取得し、投稿するなど。タイミングデータを収集する。これは実際のWebパフォーマンスではありませんが、チューニングに使用できるテストシナリオでは簡単に動作します。

  2. ウェブスタック全体。この場合、Squid、Apache、Django、MySQLなどを実行する通常のサーバーが必要です。クライアントを動かすために2台目のコンピュータが必要になります。urllib2を使ってWebサイトを実行し、6つ以下の「典型的な」ユースケースを実行します。これを取得し、投稿するなど。タイミングデータを収集する。これはまだインターネットを経由しているわけではないので、「本当の」ウェブパフォーマンスではありませんが、実際には精巧な設定なしでは得られるほど近くにあります。

#2(エンドツーエンド)には、パフォーマンスのために多くのキャッシュが含まれています。クライアントスクリプトが同様の作業を行っている場合、キャッシングは本当に有益です。あなたのクライアントスクリプトが毎回ユニークなことをするなら、キャッシュはあまり有益ではありません。

「最も一般的な」作業負荷の決定は、最も困難な作業です。これは機能テストではないため、ワークロードにすべてを含める必要はありません。また、クライアントがより多くの同時セッションを実行するほど、遅くなります。テストクライアントが処理の中で最も遅い場合、サーバーを最適化しようとしないでください。


編集

「ライン・バイ・ライン」は「プロファイリング」を意味する場合は、よく、あなたはPythonのプロファイラを実行し得るようになってきました。キャッシングの多くは、DjangoのORM層でありますことを

https://docs.python.org/library/profile.html

注意。意味のある測定値を得るためにビュー関数を6回実行することは賢明ではありません。あなたは "典型的な"一連の操作を実行してから、プロファイル内のホットスポットを見つけなければなりません。

一般的に、アプリケーションの最適化は簡単です。多大な作業を行うべきではありません。あなたのビュー関数は短く、話す処理がありません。同様に、フォームとモデルのメソッド関数は非常に短くなければなりません。

+0

主にナンバー1を参照する...私はunittestが答えかもしれないと思った! btw ... S. Lott私が投稿したほとんどすべての質問に答えることができました。それは非常に感謝しています:) 私は大学の上級生です。私はスタックオーバーフローでそんなに学びました。 – Jiaaro

+0

ありがとう優しい言葉。 –

5

Djangoアプリケーションで行ごとのパフォーマンスデータ(プロファイリング)を取得する方法の1つは、repoze.profileのようなWSGIミドルウェアコンポーネントを使用することです。

... 
application = django.core.handlers.wsgi.WSGIHandler() 
... 
from repoze.profile.profiler import AccumulatingProfileMiddleware 
application = AccumulatingProfileMiddleware(
    application, 
    log_filename='/path/to/logs/profile.log', 
    discard_first_request=True, 
    flush_at_shutdown=True, 
    path='/_profile' 
) 

そして今、あなたのプロファイルデータを表示する/ _profileにブラウザを指すことができます:あなたはこのようなあなたのアプリにrepoze.profile挿入することができますApacheでのmod_wsgiを使用していると仮定すると、

。もちろん、mod_pythonや内部のDjangoサーバでは動作しません。

+0

はmod_pythonのために存在するものは何ですか? – Jiaaro

+0

標準のPythonプロファイラ(http://docs.python.org/library/profile.htmlを参照)を呼び出しているので、方法があるかもしれませんが、mod_pythonとしてそれをうまくパッケージ化する動機はないと確信しています死んでいる。 –

+0

また、出力をもう一度見た後では、実際には行単位のパフォーマンスデータではないことも付け加えておきます。これは、各メソッド/関数の実行に費やされた時間のログです。これは、行ごとに完全に一致するわけではありませんが、近くにあります。 –