7

FastCGI (fcgi-2.4.0) のソースを調べたところ、実際にはフォークの兆候はありません。私が正しければ、WebサーバーはFastCGIモジュールのプロセスを生成し(コンパイルまたはSO / DLLとしてロード)、メインソケット(通常はポートTCP:80)の制御を処理します。

*nix では、FastCGI モジュールはファイル記述子全体 (確かにリッスン ソケット) でファイル書き込みロック (libfcgi/os_unix.c:989) を使用してそのソケットを「ロック」します。この方法では、新しい接続が発生したときに、FastCGI モジュールのみがこれらを処理できます。HTTP req 処理に引き渡す直前に、着信ソケット ロックが解放されます。

FastCGI モジュールがマルチ プロセス/スレッドではない (fork/pthread_create の内部使用がない) ように、複数の同時接続の同時処理は、n 個の FastCGI モジュール プロセスの Web サーバーからの spwaning (OS_SpawnChild 経由) によって取得されると想定しています。例として、3 つの FastCGI プロセス (Apache が 3 x OS_SpawnChild を呼び出す) を生成した場合、最大 3 つのリクエストしか同時に処理できないということですか?

A) FastCGI の動作方法に対する私のビジョンは正しいですか?

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

ありがとう、エマ!:-)

4

4 に答える 4

5

通常の CGI に対する FastCGI の速度向上は、プロセスが永続的であることです。たとえば、開くデータベース ハンドルがある場合は、1 回で済みます。どのキャッシングでも同じです。

主なメリットは、新しい php/perl/etc を作成する必要がないことです。毎回通訳者がいて、驚くほど時間がかかります。

複数の同時接続を処理したい場合は、複数のプロセス FastCGI プロセスを実行する必要があります。FastCGI は、特別な同時実行性によってより多くの接続を処理する方法ではありません。これは、個々のリクエストを高速化する方法であり、より多くのリクエストを処理できるようになります。しかし、その通りです。同時リクエストが増えると、より多くのプロセスを実行する必要があります。

于 2009-08-03T14:34:39.847 に答える
4

FastCGIで生成されたプロセスは永続的であり、要求が処理されると強制終了されず、代わりに「プール」されます。

于 2009-08-03T14:13:40.530 に答える
2

B、はい。スポーンのコストがゼロの場合、レガシーCGIはかなり良いでしょう。したがって、ヒット数が少ない場合は、古いCGIで問題ありません。高速cgiのポイントは、大量の永続ストレージ、または作業を完了する前に構築する必要のある構造の恩恵を受けることです。たとえば、大規模なデータベースに対してクエリを実行し、代わりにDBライブラリをメモリに残したい場合などです。クエリを実行するたびにシバン全体をリロードする必要があります。

あなたがたくさんのヒットを持っているとき、それは重要です。

于 2011-03-10T01:19:12.710 に答える
1

それはそう、

ご覧のように(A)は大丈夫ですが、(B)はどうですか?実行可能ファイル(perl / php / ...のようなスクリプトではなく、適切にコンパイルされたC / C ++プログラム)について話している場合、プロセスのspwanコストとDBの新しい接続コストを無視できると考えると、このアプローチ(FastCGI)はただのプレーンなCGI実行可能ファイルと比較して、ある種の小さな利益ですか?

つまり、Linuxはプロセスの生成(フォーク)が非常に高速であり、DBがローカルで実行されている場合(同じホストMySQLなど)、新しい実行可能ファイルを開始してDBに接続するのにかかる時間は実質的に0です。この場合、何も解釈されなければ、Apache C /C++モジュールのみがこれより高速になります。

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

繰り返しますが、私はスクリプト(perl / php / ...)について話しているのではなく、コンパイルされたCGIについて話しているのです。

ありがとう、乾杯、エマ!:-)

于 2009-08-03T15:56:49.857 に答える