mod_wsgiを介してDjangoを実行しているときに、WSGIDaemonProcessで指定できるプロセスの数はいくつですか?


23

1つのボックスで独自のApache仮想ホストから実行している2つのサイト(スーパーユーザーとサーバーフォールト)があるとします。2つのサイトはDjangoを使用しており、Apacheでmod-wsgiを実行しています。サイトの1つの典型的な構成ファイルは次のようになります。

WSGIDaemonProcess serverfault.com user=www-data group=www-data processes=5

ホストは、Ubuntuを実行する4GBのRAMを備えたLinuxマシンです。2つのサイトに対して上記で指定する必要のあるプロセスの数を誰でも提案できますか?実際のスーパーユーザーおよびサーバーフォールトのサイトと同じトラフィックがあると仮定しましょう。

回答:


22

さて、実際のスーパーユーザーとサーバーフォールトのサイトにはどれくらいのトラフィックありますか?仮説を立てるのに十分な情報がないと、答えを簡単にすることができません...

最悪の場合のプロセスカウントは、サイトが処理できる1秒あたりのピーク要求数を、すべての要求が最も遅いアクションに対して行われた場合に1つのプロセスが処理できる1秒あたりの要求数で割ったものである必要がありますそのアクションの処理時間の逆数)。req / secおよび時間測定の信頼区間に基づいて、適切と思われるファッジファクターを追加します。

平均ケースカウントは同じですが、要求/秒を各アクションの1秒あたりのリクエスト数の加重平均で除算します(ウェイトは、特定のアクションにヒットすると予想されるリクエストの割合です)。繰り返しますが、ファッジファクターは便利です。

マシン上で実行できるプロセスの実際の上限は、各プロセスが使用するメモリの上限によって決まります。1つのプロセスをスプールしてから、現実的なデータセット(たとえば、テストに50または100などのおもちゃデータセットを使用する場合)行の場合、アクションの1つがテーブル内のすべての行を取得して操作する場合、そのテーブルが10,000行になったときの適切な測定ではありません)、メモリ使用量がどのように膨らむかを確認します。特定のメモリ使用量のしきい値に達するワーカーを刈り込むスクリプトを使用して、プロセスごとのメモリ使用量を人為的に制限できます。そのしきい値を低く設定しすぎると、厄介な問題が発生するリスクがあります。

メモリ使用量の図を取得したら、システムオーバーヘッドのためにある程度のメモリを差し引いて(私は自分で512MBが好きです)、同じマシン(データベースなど)で他のプロセスを実行している場合はさらに山を差し引いてから、ディスクキャッシュ領域が不足しないようにするために、さらにいくつかを実行します(ディスクのワーキングセットのサイズによって異なりますが、512MB以上を使用します)。これは、上限を得るためにプロセスごとのメモリ使用量で割ったメモリ量です。

ピーク負荷に対応するために必要なプロセスの数が、ボックスに収まるプロセスの数よりも多い場合、より多くのマシンが必要です(または、最も単純な場合、データベースを別のマシンに移動するため)。

Webサイトを1つの小さなシンプルなSFポストに拡張した数年の経験があります。


プロセス/スレッドの数に関するもう1つの重要な要素は、個々の要求を処理するのにかかる時間と、考えられるすべての時間にわたる全体的な広がりです。つまり、一度に処理する必要があるリクエストの数が、平均応答時間よりも長くなります。そのため、1秒あたりの理論的な要求ほど単純ではなく、長時間実行される要求の影響が大きく、全体的な構成パラメーターを不当に決定する可能性があります。FWIW mod_wsgi 3.0には、構成を支援するためにこれに関するデータを取得しようとするいくつかの組み込み統計収集が含まれます。
グラハムダンプルトン2009年

@Graham:私の答えをもう一度読んで、それについて詳しく説明しました。Requests / secは応答時間の逆数に過ぎず、10進数で乗算するよりもreq / secの整数で除算する方が簡単です。
ワンブル

ただし、最悪の場合の応答のみに焦点を当てることはできません。期間に該当するリクエストの割合、つまり、考えられるすべての時間にわたる広がりに基づいて、重み付けする必要があります。最悪のケースの応答時間を本当に取った場合、非現実的な要件を思い付くでしょう。問題は、使用する式を知るのが本当に難しいことです。これが、mod_wsgi 3.0に組み込みの統計収集機能があり、スレッド使用率と、任意の数のスレッドが一度に使用されているカウントと時間の割合を調べる理由です。
グラハムダンプルトン2009年

3
問題は、おそらく、各プロセスがそれをどのように使用するかについて心配しているので、あなたがプロセスを見ているだけであることであり、それはそれほど単純ではありません。つまり、WSGIDaemonProcessディレクティブは5つのプロセスを示し、各プロセスはデフォルトで15スレッドを使用します。あなたの説明を読む限り、それはシングルスレッドプロセスを想定しています。そうでない場合は、モデルがスレッドに加えて、GILに関する競合/スケーリングの問題にどのように対応しているかを指摘してください。したがって、説明はシングルスレッドプロセスに対してのみ有効であり、私は議論しません。
グラハムダンプルトン2009年

2
Pythonコードとすべての依存関係がスレッドセーフであることを99%確信するまで、「multithreaded-Apache + multiprocess-wsgi」は最善策ではありませんか?
トマスツィエリスキ

9

wombleの答えは素晴らしかったが、未経験者を理解して応募するのは少し難しい。いくつかの経験的な数値、および「シンプルコンテンツ」と「eコマース」アプリケーションの比較を示したいと思います。

mod_wsgiの適切な構成に関連して、さまざまなユースケースを設定することについてはあまり資料がないので、ここで少し散文を使用してもかまいません。

A)CMSサイトとマイクロサイト

私たちはいくつかの顧客のウェブサイトを運営しています。それらのほとんどは、主にコンテンツサイトまたはdjango CMSをホストするマイクロサイト、いくつかのカスタムフォーム、およびスケジュールされたバックグラウンドタスク用のCeleryです。これらのサイトはリソースを必要とせず、それらのいくつかは32 GB RAMを搭載した単一の4コアIntel Xeon上で並行して問題なく実行されます。この種類の各サイトに使用する構成は次のとおりです。

WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100

1台のサーバーに約40のサイトがあり、そのほとんどがステージングサイトがスタンバイで実行されています。2つのプロセス(デフォルトではそれぞれ15スレッド)を使用すると、サーバーリソースを割り当てる機能が制限されますが、サイトは十分に機能します。このセットアップが十分な理由は、(CMS)アプリケーションの単純な性質で正当化できます。要求が完了するまでに数ミリ秒以上かかるとは考えられません。Apacheは常にリラックスしたままであり、CPU負荷も同様です。

B)eコマースサイト

私たちが行うより複雑なサイトの特徴は、依然として計算コストが低いローカル操作ですが、トランザクション時間の点で高価な外部依存関係(予約データを提供するWebサービスなど)です。外部リクエストを使用した操作は、はるかに長い時間スレッドを占有するため、同じ数のユーザーに対応するためにより多くのスレッドが必要です(上記の単純なCMSサイトと比較して)。さらに悪いことに、外部サービスがすぐに要求に応答できない場合、時には数秒間、スレッドがブロックされることがあります。これにより、使用可能なmod_wsgiスレッドがすべて使い果たされ、待機がブロックされるまで、スレッドが同じサービスキューにリクエストを配置するという不快な副作用が発生する可能性があります。

これらのシナリオでは6、多くの違いを見ることなくプロセスを使用しようとし12ましたが、パフォーマンスと動作の安定性の比類なき向上が見られました。

WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100

150人および250人の並列ユーザーを使用した簡単な負荷テストは、サイトの応答性を維持することで簡単に処理できます(一方、2プロセスでは、50ユーザーを並列処理するサイトは使用できません)。32 GB RAMを搭載した2 CPU 6コアIntel Xeonは、その負荷の下で25%未満のCPU使用率で実行され、RAM使用率もほぼ一定で25%未満に留まります。ここでは単一のサイト専用のマシンを使用しているため、他のサイトが必要とするリソースを盗むことはありません。

結論

より多くのプロセスを使用することは、Apacheが利用可能なシステムリソースを利用できるようにするかどうかのトレードオフです。「攻撃」状態で安定したサーバーシステム(Webサイトではありません!)を維持する場合は、数値を低くします。必要なときにシステムリソース(CPU、RAM)を使用してApacheを支援したい場合は、より大きな数を選択します。どれだけ高くすることができるかは、上記の受け入れられた答えで概説されているように計算され、最終的に利用可能なCPUパワーとRAMによって制約されます。

(PS:modwsgiプロジェクトwiki のConfigurationDirectivesセクションは、Apacheのようなバックグラウンドで読むために枕の下に置いておきます。また、Apacheサーバーの開いている接続を理解して監視してください。


素晴らしい投稿ですが、なぜスレッド数を設定しないのですか?PythonのGILはスレッドの多くの利点を無効にしているため、スレッドよりも多くのプロセスが必要になると思いますが、スレッド数を指定することには利点がありますか?
セリン

ドキュメントによると、デフォルトの数threadsは15 です。それを明示的に指定する利点はないと思います。実際、私は理由のためにそれを残したことを覚えています:副作用または回避するために値を省略することを推奨するSOまたはいくつかのドキュメントの一部に投稿がありました(それは奇妙に聞こえます)残念ながら、現在そのソースは見つかりません。残りの質問(GIL)については、おそらく私よりも専門家です。ごめんなさい。
ペテルリーノ

この経験的な構成をありがとう。ただし、この投稿に よるとYou should never use maximum-requests in a production system unless you understand the implications and have a specific temporary need.
raratiru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.