問題が発生した環境:
Nginx
nginx の php-fpm 拡張機能としての PHP 5.3.10
mongodb-php-ドライバー 1.2.12
MongoDB 2.2
この問題は、MongoDB PHP Driver 1.2.x の公式機能によって発生します。説明については、PHP-202 および PHP-347 を参照してください。簡単に言えば、PHP-FPM モードでは、各 PHP ワーカー プロセスが独自の独立した mongodb 接続プールを持ち、そのため接続数が標準を軽く超え、メモリ数が 2 倍になります。
1. PHP サービスの背景:
特定の Web アプリケーションは、Nginx+factcgi を実行する PHP プログラムによって提供されます。
PHP-FPM の子プロセスの最大数は、php-fpm.conf の max_children パラメータによって設定されます (または、pm=dynamic の場合は、spare_servers+start_servers パラメータによって包括的に決定されます)。この値は以前は 512 に設定されていました。
2 番目、MongoDB サービスの背景:
mongodb インスタンスの最大接続数制限は、起動パラメータの maxConns で設定できます。
maxConns: デフォルト値はシステム制限 (ulimit やファイル記述子など) によって異なります。このパラメータが設定されていない場合、mongodb 自体は接続数を制限しません。ただし、20,000を超える値は設定できません。
通常、maxConns パラメータを意図的に設定しないでください。
三、MongoDB PHP ドライバーのひどい接続プール機能 (バグ?)
MongoDB が公式に提供する mongodb-php-driver は、1.3.0 未満のバージョン (1.2.0 ~ 1.2.1x) では接続プールの実装が不十分で、クエリを実行すると、完了後に接続プールから接続が要求されます。 、接続プールに返します。ここでの完了とは、接続を保持している変数がそのスコープを離れることを意味します。 www.2cto.com
PHP-FPM モードでは、PHP Web アプリケーションが MongoDB インスタンスに対して確立できる同時接続の数は次のように計算されます。
プロセスの数: max-children = 512 の場合、プロセスは 512 個になります。
1 つの MongoDB インスタンスは 1 つの接続プールに対応します。メイン サイトは 2 つのレプリカ セット インスタンス 165 と 166 で構成されます。
接続プール内の接続数: mongodb-php-driver には制限がなく、ハンドルがなくなるまで無制限に増やすことができます。
——————Zheng Yun: この計算方法は mongo.connecting.pools から来ています——————
mongodb の公式ドキュメントによると、理論的には接続数が無限に増加する可能性がありますが、実際の観察では、Web サーバーと mongodb インスタンス間の接続数は通常、大きな変動がなく単一の値で安定することがわかりました。
したがって、PHP Web アプリケーションによって開始された mongodb-165 への接続の数は次のようになると仮定します。
750個、
この目的のために MongoDB インスタンスが維持する必要があるメモリの量は少なくとも次のとおりです:
750 × デフォルトの 10MB = 7.5 GB
http://www.bkjia.com/PHPjc/477804.html
www.bkjia.com
truehttp://www.bkjia.com/PHPjc/477804.html技術記事問題が発生する環境: nginx mongodb-php-driver 1.2.12 の php-fpm 拡張機能としての Nginx PHP 5.3.10 MongoDB 2.2 この問題は、MongoDB PHP Driver 1.2.x の公式機能によって発生します。説明については、を参照してください。 ...