php-fpmを使用した10台のサーバーで、1秒あたり約11000ヒットがあります。私は mysql から postgres に移行しているので、私の質問は pg_* p *connect を使用する意味がありますか?
3 に答える
PgBouncerのような専用の接続プーラーを使用することをお勧めします。
パフォーマンスは に匹敵するはずですpg_pconnect
が、PgBouncerを使用すると、PHP コードでエラーが発生した後にクリーンアップを実行できます。開いているトランザクション、ロック、準備済みステートメントなどpg_pconnect
を自動的に消去しません。
PostgreSQL サーバーへの接続の確立は、MySQL サーバーへの接続よりも大幅にコストがかかると予想されます。これは、これらのデータベースがリソースの割り当てと独立した接続間の特権の分離を処理する方法が異なる設計上の選択によるものです。
したがって、Web サイトの場合、可能な限り PostgreSQL への接続を再利用することは完全に理にかなっています。
一般的に推奨される方法は、このタスクにより適したpgBouncerやpgPoolIIpg_pconnect
などの外部接続プーラーを使用することではありません。ただし、PHP-FPM を使用している場合は、fpm プロセス マネージャーのオプションを使用して開いている接続の数を何らかの方法で制御できるミドルウェアが既にあるため、それで十分な場合があります。ゼロ以外の値に設定して、接続が適切な頻度で確実にクリーンアップされ、オフピーク時に未使用の接続が山積みになるのを防ぐことを検討してください。pm.max_requests
pg_pconnect は、PHP バックエンドごとに 1 つの接続を持つことを意味するため、バックエンドの数によって異なります。従来の Apache mod-php セットアップでは、初心者にはなりませんが、うまくいく可能性があります。
データベース サーバーは数百のアイドル接続を処理できますが、すべての接続でクエリが同時に発行されている場合は、ほぼ確実に停止します。コアあたりの接続は 2 つまでという経験則を見てきました。これは、最初に I/O によって制限されないことを前提としています。
一般的なアプローチは、 pgbouncerのような接続プーラーを実行し、リクエストごとに php を接続させることです。これにより、同時実行性を妥当に保ちながら、接続のオーバーヘッドを削減できます。