web-dev-qa-db-ja.com

Django Apache / mod_wsgi / windowsでのマルチスレッド

私はApacheとDjangoの組み合わせにまったく慣れておらず、マルチスレッドの処理方法について率直に言って非常に素朴です。具体的にはWindowsサーバーで実行しているので、MPMはスレッドのみであることがわかります-ベース。

Webサイトのページを提供するアプリケーションと、CPUを集中的に使用するバックグラウンドプロセスを実行するアプリケーションがあります。これは時々発生し、30秒ほどかかります。パフォーマンスの問題が発生し、いくつか質問があるのではないかと心配しています。これらが他の人にも役立つことを願っています...

  1. Apacheはスレッド間で同時リクエストをどのように分散しますか?とCPU間?これを駆動するのはどのようなロジックですか?各リクエストは別々のスレッドを生成しますか?
  2. 別のCPUで実行する特定のアプリを手動で指定できますか?たとえば、4つのCPUを搭載したマシンがある場合、Webサイト要求用に1つのCPUを設定し、オンデマンドでバックグラウンドプロセスを実行するために他の3つのCPUを設定できますか?
  3. 複数のスレッドが同じデータベースに対してどのように読み取り/書き込みを行いますか?書き込みはユーザーごとに行われるため、衝突することはないと思いますが、実際にどのように処理されるかはわかりません。
  4. たとえば、EC2で実行され、複数のインスタンスがある場合など、そのようなマシンが複数ある場合はどうなりますか?リクエストはどのように配布されますか?

ありがとうございました

2
Ilan lewin

一般的な読み物については、以下を参照してください。

Apacheはスレッド間で同時リクエストをどのように分散しますか?

マルチスレッド構成の場合、事前に作成されたスレッドのプールがあります。新しいリクエストが到着すると、それはプール内の利用可能なスレッドの1つに渡されて処理されます。完了すると、スレッドはプールに戻ります。

ApacheはCPU間で同時リクエストをどのように分散しますか?

そうではなく、特定の時点でスレッドが実行される場所は、オペレーティングシステムによって決定されます。スレッドはApacheによって特定のプロセッサにバインドされていないため、実行を移動できます。

各リクエストは別々のスレッドを生成しますか?

Apacheによって処理されるWebリクエストの場合、答えはノーです。

別のCPUで実行する特定のアプリを手動で指定できますか?

プロセスをプロセッサにバインドするようにプロセッサアフィニティを設定する方法はいくつかありますが、その方法はシステムによって異なります。 Apache自体は、私が知る限り、それを実行するための構成メカニズムを提供していません。

複数のスレッドが同じデータベースに対してどのように読み取り/書き込みを行いますか?

慎重に。通常、データベースサーバープロセスはこれらすべてを心配しているので、心配する必要はありません。クライアントでは、リクエストごとに1つ作成して、各スレッドが独自のデータベース接続を使用していることを確認する必要があります。または、データベース接続のプールがあり、スレッドは必要に応じてプールから接続を取得し、次の場合にそれを返します。完了しました。

これは、アクセスがサーバープロセスを介して仲介されるデータベースを前提としていることに注意してください。ファイルシステムベースのデータベースを使用している場合、データベースクライアントライブラリはマルチスレッドアクセスが安全であることを保証する必要があります。

EC2で実行され、複数のインスタンスがある場合など、そのようなマシンが複数ある場合はどうなりますか?リクエストはどのように配信されますか?

リクエストを分散するには、ある種のフロントエンドロードバランサーが必要になります。これは適切なロードバランサーであるか、nginxフロントエンドをプロキシとして使用する可能性があります。

4