3

私は現在高負荷プロジェクトを開発しています。C/FastCGI/nginx の組み合わせを使用する必要があります。

問題は、FastCGI アプリケーションをスレッド/プロセスで実行する必要があることです。

私はそれを行う2つの方法を知っています:

1) プログラムをコンパイルし、spawn-fcgiを使用してプロセスをフォークします。(これは使えません)

2) を実行FCGX_Init()し、10 個のプロセスに pre-fork する BEFOREwhile (FCGX_Accept_r(&request) >= 0)

3) pthreads AFTER を実行するwhile (FCGX_Accept_r(&request) >= 0)

だから、私の質問は: whis は fastcgi アプリケーションを実行する最速の方法です。この後、fastcgiアプリケーションを事前にフォークできますか:

int sock = FCGX_OpenSocket(":9000", 10);
FCGX_InitRequest(&request, sock, 0);

10 個のプロセスが単一のソケットをリッスンできますか? N 個のプロセスを実行している場合、スレッドを使用する必要がありますか? これで十分ですか?

4

1 に答える 1

4

具体的に使用している FastCGI API については知りませんが、通常、フォークする前に開いていない限り、ファイル記述子 (つまりソケット) を別のプロセスに渡すことはできません。プロセスには、独立したファイル記述子テーブルがあります。スレッドは同じプロセスにあるため、すべて同じファイル記述子テーブルを共有します。

私の知る限り、一度に 1 つのポートでリッスンできるプロセスは 1 つだけです。通常行われるのは、接続をリッスンする唯一のジョブを持つ 1 つのスレッドを用意することです。1 つ取得すると、接続が受け入れられ、プール内の次のワーカー スレッドに渡されます。これは、ソケットが閉じられるまで、受け入れられたソケット (リッスンしているソケットではなく) をスレッドに引き継がせることによって行われます。リスナー スレッドはすぐに接続のリッスンに戻ります。

これにより、オーバーヘッドが最小限に抑えられます。

于 2011-06-23T21:29:27.473 に答える