2009-08-03 9 views
7

私はFastCGI(fcgi-2.4.0)のソースを見て、実際にフォークの兆候はありません。 私が正しいとすれば、WebサーバーはFastCGIモジュールのプロセス(コンパイルされているか、SO/DLLとしてロードされている)を認識し、メインソケット(通常はポートTCP:80)の制御を処理します。FastCGIはどのようにWebサーバー(Apache 2.2以上など)で動作しますか?

On * nix FastCGIモジュールは、ファイル記述子全体(実際にはリスンソケット)にファイル書き込みロック(libfcgi/os_unix.c:989)を使用してそのソケットを「ロック」します。新しいコネクション収入がFastCGIモジュールだけがこれらを処理できるようになると、このようになります。 着信ソケットロックは、HTTP要求処理へのハンドオーバの直前に解放されます。

FastCGIモジュールとして見られるようには、nのFastCGIのマルチプロセス/スレッド(フォーク/のpthread_createのない内部使用)Iは、複数の同時接続の同時処理が(OS_SpawnChild介して)ウェブサーバからspwaningによって得られると仮定しませんモジュールプロセス。 たとえば、3つのFastCGIプロセス(Apacheが3 x OS_SpawnChildを呼び出す)を起動すると、最大3つの要求を同時に処理できるということですか?

A)FastCGIの私のビジョンは正しく働いていますか?

B)新しいプロセスを作成する/ローカルDBへの接続を作成するコストが無視できると考えられる場合、の従来の方法である実行可能アプローチに対するFastCGIの利点は何ですか?

ありがとう、 Ema! :-)

答えて

4

FastCGIの生成されたプロセスは永続的ですが、要求が処理されると、それらは "プールされ"ます。

+0

アール、おかげさまですが、私はすでにこれを...私はより具体的な答え(A、B)を求めていました。乾杯、 –

5

通常のCGIと比較してFastCGIからの速度向上は、プロセスが永続的であることです。例えば開いているデータベースハンドルがあれば、それらを一度行うことができます。任意のキャッシングと同じです。

主な利点は、新しいphp/perl/etcを作成する必要がないことにあります。通訳者は毎回驚くほどの時間を要します。

複数の同時接続を処理する場合は、複数のプロセスFastCGIプロセスを実行する必要があります。 FastCGIは、あらゆる種類の特別な並行処理を介してより多くの接続を処理する方法ではありません。これは、個々の要求を高速化する方法であり、これによりさらに多くの要求を処理できます。しかし、はい、あなたは正しいです。より多くの同時リクエストでは、より多くのプロセスを実行する必要があります。

+0

本当ではありません。 FastCGIを使用すると、1つのスレッド*で複数の同時要求を処理できます。これは[文字通りFastCGIにとって最大の利点であり、長時間の接続では多重化を行わなければほとんど利益をもたらさない](http://www.nongnu.org/fastcgi/#multiplexing)。 – Alice

1

は確かに、(A)見よう

は今、何を(B)について、okですか? 私が実行可能ファイル(適切にコンパイルされたC/C++プログラム、perl/php/...のようなスクリプトではない)について話していて、プロセスspwanコストとDBの新しい接続コストを無視できると考えるなら、このアプローチ(FastCGI)は単純なCGI実行ファイルと比較して、わずかの小額のゲインがありますか?

Linuxがプロセスを生成(fork)する速度が非常に速く、DBがローカル(たとえば同じホストMySQL)で実行されている場合、新しい実行ファイルを起動してDBに接続する時間はこの場合、何も解釈されることなく、Apache C/C++モジュールだけがこれより速くなります。

FastCGIアプローチを使用すると、プロセスが毎回フォーク/再開されないため、memリークがさらに脆弱になります...この時点で、CGIをC/C++で開発する必要がある場合は、古い学校の CGIまたはApache C/C++モジュールを直接使用する方がよいでしょうか?

私はスクリプト(perl/php/...)については言及していませんが、私はCGIのコンパイルについて話しています。

ありがとう、もう一度、 乾杯、Ema! :-)

+1

フォークのコストは、CGIを介してPHPを実行する場合の一部に過ぎません。プロセスがフォークされたら、PHP実行可能ファイルをメモリにロードし、起動時に初期化する必要があります。また、データベースへの新しい接続を開くことは、既存のものを再利用するよりはるかに高価です。 – BeWarned

+2

皆さん、回答ありがとうございますが、私はperl/phpスクリプトについては言及していませんが、コンパイルされたEXECUTABLESについては(C++ソースコードはcgiccライブラリに対してコンパイルされています)...もっとはっきりと書く方法はわかりません... –

+1

絶対にありません。 FastCGIは多重化をサポートすることができます。つまり、一度に多数の接続を処理できます。これは適切にプログラムされていれば、パイプラインを形成できることを意味します。データベース接続から新しい接続が飢えてしまうことはありません。 FastCGIモジュールの平均レイテンシは、CGI **よりもはるかに小さいです(**)。 – Alice

2

B、はいスポーンのコストがゼロの場合、従来のCGIはかなり良いでしょう。ですから、古いCGIはあまり好きではない場合は、それを実行してください。高速cgiのポイントは、多くの永続的なストレージや、大容量のデータベースに対してクエリを実行したり、代わりにDBライブラリをメモリに残したいなど、作業を完了させる前に構築しなければならない構造クエリを実行するたびにシバン全体をリロードする必要があります。

大ヒットしても問題ありません。

+0

; CGIはキャッシュできません。つまり、すべてのストレージをリロードする必要があります(データベースへのアクセスは、単純なCプログラムのロードよりも簡単に遅くなる可能性があります)。 CGIは多重化もできません(同時実行性を得るには、複数のプロセスが必要です)。これらの2つの利点は、産卵のコストよりもはるかに重要です。さらに、[基本的にCGIモジュールをFastCGIで動作させるためのプログラミング費用はありません。注意深いコードで、CGIまたはFastCGIとしてFastCGIモジュールを正しくロードすることは自明です。](http://www.fastcgi.com/devkit/ doc/fastcgi-prog-guide/ch2c.htm) – Alice

関連する問題