
私は Apache と Django の組み合わせにはまったく不慣れで、率直に言って、マルチスレッドの処理方法についてはまったく無知です。具体的には、Windows サーバー上で実行しているので、MPM はスレッドベースのみであることを知っています。
ウェブサイトのページを提供するアプリケーションと、時々発生し、30 秒ほどかかる CPU を集中的に使用するバックグラウンド プロセスを実行する別のアプリケーションがあります。パフォーマンスの問題が発生するのではないかと心配しており、いくつか質問があります。これらの質問が他の人にも役立つことを願っています...
- Apache は同時リクエストをスレッド間、および CPU 間でどのように分散するのでしょうか? これはどのようなロジックによって実行されるのでしょうか? 各リクエストは個別のスレッドを生成するのでしょうか?
- 特定のアプリを別の CPU で実行するように手動で指定できますか? たとえば、CPU が 4 つあるマシンがある場合、1 つの CPU を Web サイト リクエスト用に、他の 3 つの CPU をオンデマンドのバックグラウンド プロセス実行用に設定できますか?
- 複数のスレッドが同じデータベースに対して読み取り/書き込みを行うにはどうすればよいですか? 書き込みはユーザーごとに実行されるため、衝突は発生しないと思われますが、実際にどのように処理されるかはわかりません。
- EC2 上で実行され、複数のインスタンスを持つなど、このようなマシンが複数ある場合はどうなりますか? リクエストはどのように分散されますか?
ありがとう
答え1
一般的な読み物については以下を参照してください:
- http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading
- http://blog.dscpl.com.au/2009/03/python-interpreter-is-not-created-for.html
Apache は同時リクエストをスレッド間でどのように分散しますか?
マルチスレッド構成の場合、事前に作成されたスレッドのプールがあります。新しいリクエストが到着すると、プール内の利用可能なスレッドの 1 つに渡されて処理されます。処理が完了すると、スレッドはプールに戻ります。
Apache はどのようにして CPU 間で同時リクエストを分散するのでしょうか?
そうではありません。特定の時点でスレッドが実行される場所は、オペレーティング システムによって決定されます。スレッドは Apache によって特定のプロセッサにバインドされないため、実行は移動できます。
各リクエストは個別のスレッドを生成しますか?
Apache によって処理される Web リクエストの場合、答えは「いいえ」です。
特定のアプリを別の CPU で実行するように手動で指定できますか?
プロセッサ アフィニティを設定してプロセスをプロセッサにバインドする方法はいくつかありますが、その方法はシステムによって異なります。私の知る限り、Apache 自体は、それを実行するための構成メカニズムを提供していません。
複数のスレッドが同じデータベースに対して読み取り/書き込みを行うにはどうすればよいですか?
慎重に。通常、データベース サーバー プロセスがこれらすべてを処理するので、心配する必要はありません。ただし、クライアントでは、各スレッドが独自のデータベース接続を使用していることを確認する必要があります。そのためには、リクエストごとに 1 つずつデータベース接続を作成するか、データベース接続のプールを用意して、スレッドが必要に応じてプールから接続を取得し、完了したらそれを返します。
これは、アクセスがサーバー プロセスを介して仲介されるデータベースを前提としていることに注意してください。ファイル システム ベースのデータベースを使用している場合は、データベース クライアント ライブラリによって、マルチスレッド アクセスが安全であることが保証される必要があります。
EC2 上で実行され、複数のインスタンスを持つなど、このようなマシンが複数ある場合はどうなりますか? リクエストはどのように分散されますか?
リクエストを分散するには、何らかのフロントエンド ロード バランサーが必要です。適切なロード バランサーを使用するか、プロキシとして nginx フロントエンドを使用することもできます。