2011-06-23 8 views
3

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

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

私はそれを行うには、2つの方法を知っている:

1)プログラムとプロセスをフォークするのspawn-fcgiのを使用するよりも、コンパイルします。 whisは次のとおりです。実行のpthreadsだから、私の質問があるwhile (FCGX_Accept_r(&request) >= 0)

後)while (FCGX_Accept_r(&request) >= 0)

3 BEFORE 10 processessにプリフォークよりも実行FCGX_Init()

2)(私はこの1つを使用することはできません) FastCgiアプリケーションを実行する最速の方法。私はこの後、FastCGIアプリケーション・フォークを事前ことができます。

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

は10個のプロセスは、単一のソケットに耳を傾けることはできますか?Nプロセスが実行されている場合、スレッドを使用する必要がありますか?これで十分でしょうか?

+0

なぜ 'spawn-fcgi'を使用できないのですか?それはあなたのためにフォークの負荷分散を処理するので、最良の選択肢と思われます。 – T0xicCode

答えて

4

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

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

これは最小のオーバーヘッドを与えるはずです。