接続の処理を理解する
Postgres では、プロセスベースの接続モデルが使用されます。 接続の確立には、オペレーティング システムと少量のメモリの割り当てが含まれます。 各 SQL クエリは、現在の接続を使用して実行されます。
接続の状態
接続は、次の 4 つの状態のいずれかになります。
- アクティブ - 現在クエリを実行しているアクティブな接続。
- アイドル - 開かれてはいるが使用されていない接続。
- トランザクションでアイドル状態 - 接続が待機中で、処理は行われません。 pg_stat_activityを使用して、接続の動作と、その状態の長さを把握します。
- トランザクション中のアイドル (中止) - トランザクション中のアイドル状態だったものが、今は中止状態になっている接続。
プロセス ベースの接続モデルでは、多くのアイドル状態の接続を維持するためにコストがかかります。
最大接続数
PostgreSQL では、 max_connections というサーバー パラメーターを使用して、サーバーへの同時接続の最大数を一度に制限します。 Azure Database for PostgreSQL では、既定値はコンピューティング レベルによって異なります。 使用できる値は 25 ~ 5000 です。
PostgreSQL のオンプレミス実装では、スーパー ユーザーがデータベースの整合性を維持するためにいくつかの接続が予約されます。 この予約は通常、max_connections 値の 15% となります。
Azure Database for PostgreSQL はマネージド ソリューションであり、フレキシブル サーバーを監視するために 3 つの接続を自動的に予約します。
手記
Azure Database for PostgreSQL で superuser_reserved_connections を管理するためのサーバー パラメーターはありません。
接続のプール
接続を頻繁に開いたり閉じたりするクライアント アプリケーションでは、接続の待機時間が発生し、1 秒あたりのトランザクション数が少なくなり、アプリケーションの全体的な待機時間が長くなる可能性があります。
Azure Database for PostgreSQL では、頻繁に接続を開いたり閉じたりするのではなく、接続プールを推奨しています。 接続プールは、接続を閉じて再作成するのではなく、既存の接続を利用し続けます。 このプロセスにより、接続の待機時間が短縮され、サーバー上のデータベースに対して 1 秒あたりのデータベース トランザクション数が増加します。
接続プールでは、サーバーの起動時に固定の接続セットが確立され、これらの接続が維持されます。 接続プールは、サーバー上で新しい接続が常に作成されることによって発生するメモリの断片化を減らすのにも役立ちます。
PGBouncer は、Azure Database for PostgreSQL に組み込まれている接続プール ソリューションです。 pgBouncer を有効にするには:
- Azure portal で、Azure Database for PostgreSQL サーバーに移動します。
- 左側のメニューから、[サーバー パラメーター] 選択します。
- 検索バーで PgBouncer を検索します。
- PgBouncer を有効にするには、pgbouncer.enabled 設定を true に設定します。 この設定では、サーバーを再起動する必要はありません。
- pgbouncer.default_pool_sizeに、必要なユーザーとデータベースのペアあたりの接続数を設定します。 既定値は 50 です。
- pgBouncer.pool_mode パラメーターを TRANSACTION に設定します。
手記
PgBouncer は、パブリック アクセスとプライベート アクセス ネットワークの両方で General Purpose コンピューティング レベルとメモリ最適化コンピューティング レベルでサポートされています。 PgBouncer は、バースト可能なコンピューティング レベルではサポートされていません。 コンピューティング レベルが General Purpose または Memory Optimized から Burstable に変更されると、PGBouncer 機能は失われます。