PROD欧州主権の BaaS プラットフォームダッシュボードを開く →

パフォーマンス · 9 分読み取り

Postgres max_connections (プーラーなし)

Affane Daylami · Fondateur · 2026年6月6日

ブログに戻る

サーバーの前にプールしない場合、max_connections は、Postgres が並行して効率的に処理できるリクエストの数ではなく、開いているすべてのクライアント接続を同時にカバーする必要があります。これら 2 つの数値を混同することが、負荷を吸収するには低すぎるか、実際に利用可能なメモリに対して高すぎるなど、max_connections が誤って設定される最も一般的な原因です。

この英語のテキストはフランス語のオリジナルから自動的に生成されたもので、まだレビューされていません。
このページは自動翻訳されました。英語版が正式です。

この記事では、ハードウェアの理想的な同時実行性を計算するために PostgreSQL Wiki によって公開されている式 (エコシステムで最も引用されている 接続プールのサイジング式) を示し、各接続のコストがアプリケーション スレッドよりも高い理由を説明し、推測せずに max_connections を設定する手順を詳しく説明します。私たちの ベンチマーク方法論 は、このブログのパフォーマンスに関する主張に使用される測定プロトコルを文書化しています。

必需品

  • プールを使用しない場合、max_connections は Postgres が効率的に並列処理できるものだけでなく、すべての 同時クライアント接続をカバーする必要があります。
  • PostgreSQL Wiki の参照式: 理想的なアクティブ同時実行数 = (物理コア × 2) + 効率的なディスク。測定によって検証される開始点であり、厳密な制限ではありません。
  • max_connections は postmaster コンテキスト パラメータです。これを変更するには、単純なリロードではなく、サーバーを完全に再起動する必要があります。
  • 各 Postgres 接続は、軽量スレッドではなく、別個のシステム プロセスです。これが、接続数が増加するとすぐにオーバーヘッドが現実のものになる原因です。
  • コードで確認: 専用の Postgres クラスタでは、Aurabase はクラスタのサイズに応じて max_connections を 50 (無料層) から 400 (エンタープライズ層) まで変化させます。
#
診断

Postgres 接続のコストがアプリケーション スレッドよりも高い理由

Postgres は接続に軽量スレッド プールを使用しません。クライアント接続ごとに、本格的なシステム プロセスがトリガーされます。

postmaster プロセスは、接続が試行されるたびに新しいプロセス (「フォーク」) を作成し、セッションが終了するまでこの単一セッション専用になります。公式プロジェクトのドキュメントでは、アーキテクチャの基礎に関する章でこのメカニズムが正確に説明されています (postgresql.org/docs/current/connect-estab.htmlの「接続セマンティクス」セクション、2026 年 8 月 24 日にアクセス)。

この選択には大きな利点があります。1 つの接続でクラッシュしても他の接続には影響せず、各プロセスはサーバーの残りの部分から分離されます。また、直接的なコストもかかります。接続が追加されるたびに、OS プロセス全体がスケジュールに追加され、独自のメモリ空間とカーネルのコンテキスト スイッチング オーバーヘッドが発生します。

実際に何が変わるのか

プールせずに Postgres への 500 の直接接続を開くアプリケーションでは、2 つのリクエストの間でプロセスの大部分がアイドル状態のままであっても、サーバーは 500 の同時システム プロセスを管理する必要があります。

#
メモリコスト

接続が実際に消費するもの: 共有メモリと work_mem

2 つの異なるメカニズムが記憶に影響を及ぼし、それらを混同するとほとんどの場合誤診につながります。

1つ目は修正されています。 Postgres は起動時に、これらの接続がその後開かれるかどうかに関係なく、max_connections の値に応じたサイズの共有メモリ構造 (ロック、プロセス テーブル) を予約します。この設定の公式ドキュメントでは、この設定を増やすと、OS のデフォルト構成で許可されているよりも多くのシステム共有メモリが必要になる可能性があると明示的に指摘されています (postgresql.org/docs/current/runtime-config-connection.html、2026 年 8 月 24 日にアクセス)。

2 つ目は可変であり、大規模になるとさらに危険です。work_mem は接続ごとに 1 回割り当てられるのではなく、クエリ プランの並べ替えまたはハッシュ操作ごとに 1 回割り当てられます。この点については、公式ドキュメントで明示されています。複雑なクエリではこれらの操作のいくつかを並行して起動でき、複数のセッションで同じことを同時に行うことができるため、実際に使用されるメモリは work_mem の数倍の価値がある可能性があります (postgresql.org/docs/current/runtime-config-resource.html、2026 年 8 月 24 日にアクセス)。

覚えておくべき本当に最悪のケース

サーバーのメモリを脅かすのは、max_connections × work_mem だけではありません。これは、max_connections × work_mem × クエリごとの同時操作の数です。この製品は、無害であると考えられる max_connections の増加後にスワップするサーバー、またはメモリ不足になるサーバーについて説明します。

#
計算式

PostgreSQL Wiki のサイジング公式

公式 PostgreSQL プロジェクト Wiki には、開いている接続の合計数ではなく、ハードウェアが並行して効率的に処理できるアクティブな 接続 の数を計算するためのベンチマーク式が文書化されています (wiki.postgresql.org/wiki/Number_Of_Database_Connections、2026 年 8 月 24 日にアクセス)。

式

理想的なアクティブ同時実行数 = (物理コア × 2) + 効率的なディスク。コア数にはハイパースレッディングは含まれません。最新の SSD ストレージでは、有効なディスクの数は 1 に近いままであり、独立した物理ディスク (「スピンドル」) の概念は本来の意味をほとんど失っています。

8 つの物理コアと SSD ストレージを備えたサーバーでは、式により、スループットが低下し始めるまでに、(8 × 2) + 1 = 17 のアクティブな接続が得られます。この数字はしばしば驚くべきものであり、アプリケーションが実際に開く数百の接続に比べれば、非常に小さいように見えます。これはまさに次の段落の主題です。

式によって計算される数値は、アプリケーションが開く必要があるクライアント接続の数ではなく、CPU とディスクが吸収できる同時実行性を測定します。 20 個のアプリケーション プロセスからなるフリートは、それぞれが 10 個の接続の独自のプールを持ち、たとえ特定の時点でアクティブに動作しているのが 17 個だけであっても、Postgres への同時接続を 200 個開きます。プーラーがない場合、max_connections は 17 ではなく 200 をカバーする必要があります。このギャップこそが、たとえどれを選択することになるとしても、ほとんどのアーキテクチャーで プーラーをトランザクション モードに追加することを促すのです (の PgBouncer、Supavisor、および PgCat の比較を参照してください)。

#
手順

max_connections を変更する方法 (および再起動が必要な理由)

max_connections はホットスワップされません。これは postmaster コンテキスト パラメータです。Postgres は起動時にこれを 1 回読み取り、共有メモリのサイズを設定します。構成のリロード (pg_reload_conf() または SIGHUP) だけでは十分ではないため、サーバーを再起動する必要があります。

まず現在の値とそのコンテキストをチェックして、再起動が必要かどうかを確認します。

psqlsql
SHOW max_connections;

SELECT name, setting, context
FROM pg_settings
WHERE name = 'max_connections';

-- context='postmaster' は再起動が必要であることを確認します

次に、新しい値を適用して、再起動します。

psqlsql
ALTER SYSTEM SET max_connections = '300';

-- postgresql.auto.conf に記述されます。
-- Postgres が再起動されるまで効果はありません。
terminalbash
# systemdを使用した場合
sudo systemctl restart postgresql

# systemd を使用せず、pg_ctl を直接使用
pg_ctl restart -D $PGDATA -m fast
多くの人が忘れている余白

max_connections には、デフォルトで superuser_reserved_connections (デフォルトでは 3) が含まれます。これらの接続は、飽和状態になった場合に備えてスーパーユーザー用に予約されており、グローバル カウンタにまだ到達していない場合でも、アプリケーションでは決して使用できません。

#
コードをチェックインしました

Aurabase が Postgres クラスタで max_connections を割り当てる方法

max_connections のサイズ設定は、単なる理論的な作業ではありません。 Aurabase が管理対象 Postgres クラスターに予算を割り当てる方法は次のとおりです。

100
Postgresのデフォルト
調整前の max_connections
50→400
専用のオーラベースベアリング
CNPG クラスターによるエンタープライズへの無料提供
3
スーパーユーザー予約済み
superuser_reserved_connections、Postgres のデフォルト

専用クラスター: プロジェクトごとに 1 つの Postgres クラスター

このレベルでは (専用と共有ベースのの比較を参照)、各プロジェクトは、インスタンスのサイズに合わせてサイズ設定された独自の CloudNativePG クラスターと独自の max_connections バジェットを受け取ります。

無料(専用)最大接続数 501 インスタンス · 500m vCPU · 512Mi
プロ (デフォルト)最大接続数 2002 インスタンス · 1 vCPU · 2Gi
チーム最大接続数 3003 インスタンス · 2 vCPU · 3Gi
ビジネス最大接続数 4003 インスタンス · 2 vCPU · 4Gi

共有クラスター: 組織の複数のプロジェクト、共有予算

この 2 番目のパスでは、同じ組織のすべてのプロジェクトが、共有プライマリの前にある CNPG プーラー (PgBouncer、transactionモード) を介して接続します。

無料最大接続数 50max_client_conn 100最大ユーザー接続数 20
プロ最大接続数 100max_client_conn 200最大ユーザー接続数 60
チーム最大接続数 200max_client_conn 400最大ユーザー接続数 150

組織内のすべてのプロジェクトは、共有アプリケーション ロールを通じて接続します。 したがって、max_user_connections だけで、このロールがクラスター全体で開くことができるサーバー接続の合計に上限が設定されます。これは、プーラー自体へのクライアント接続のみを制限する max_client_connではなく、実際のクラスター全体の安全策です。

ただし、このプーラーは SDK アプリケーション トラフィックのみを処理します。 PostgREST に関しては、プライマリ (-rwサービス) に直接接続されたままになります。トランザクション モードでプールすると、 pgrstという名前の専用 LISTEN チャネルをリッスンするスキーマ リロード メカニズムが壊れます。したがって、独自の接続 (共有レベルのレプリカごとに 2、専用レベルのレプリカごとに 10) は、プーラーの外部でプライマリの max_connections バジェットに直接カウントされます。これは、まさに、以下の手順のステップ 1 で含める必要がある種類の「忘れられた」接続です。

現在校正中の数値です。

コードでは、これらの共有プーラー バジェットを、公開されたベンチマークからの固定数値としてではなく、負荷下で pg_stat_activity を測定することによって、実際の条件で調整される開始値として明示的に文書化します。これは、ベンチマーク方法論で説明されているものと同じ規律です。推測して期待するのではなく、調整する前に測定します。これらのクラスターは PostgreSQL 16 で実行されます。この選択は、Postgres 16 対 17 対 18の比較に記載されています。

#
方法

プールせずに max_connections のサイズを変更する 5 ステップの手順

この手順は特定のツールには依存しません。管理対象または自己ホスト型の任意の Postgres サーバーに適用されます。

  1. 実際のクライアント接続をカウントします。 アプリケーション プロセスの数に内部プールのサイズを掛けたものに、管理ツール、レプリケーション、監視を加えたもの。 max_connections の下限を設定するのは、式ではなくこの数値です。
  2. PostgreSQL wiki の式 (物理コア × 2) + 効率的なディスクを使用して、ハードウェアの理想的な同時実行性 を計算します。この図は、スループットを低下させることなく、これらの接続のうち実際にいくつが並行して動作できるかを示しています。
  3. max_connections を手順 1 で実際に必要な値よりも大きく設定し、superuser_reserved_connections およびアプリケーションの外部で独自の接続を開く管理ツール用に余裕を持たせます。
  4. ALTER SYSTEM SET を使用して変更を適用し、サーバーを再起動します。 これはポストマスター パラメータです。上で詳しく説明したように、単純なリロードでは十分ではありません。
  5. pg_stat_activity を経時的に監視します。 アイドル状態の接続の数がアクティブな接続の数を大幅に超えている場合、これは max_connections の問題ではありません。これは、より大きな数ではなく、サーバーの前にプーラーが必要であることを示しています。

ステップ 5 のモニタリング リクエストは、直接使用できます。

psqlsql
SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state
ORDER BY count(*) DESC;
#
警告信号

フォーミュラではもう十分ではないとき: プーラーが必要な兆候

max_connections だけでは十分ではなくなった場合、その値に関係なく、体系的に 3 つのシグナルが返されます。

  1. FATAL: sorry, too many clients already エラーはピーク負荷時に表示されますが、pg_stat_activity によって表示される接続の大部分はアイドル状態です。
  2. アプリケーションはサーバーレス環境または一時的なワーカー (エッジ機能、短いジョブ) で実行され、Postgres の接続ごとのプロセス モデルが対応できるように設計されているよりもはるかに高速に接続を開いたり閉じたりします。
  3. 上記の式と手順はすでに適用されており、クライアント接続の実際の必要性は、work_mem やshared_buffers を危険にさらすことなく利用可能なメモリが割り当てることができる量を超え続けています。

これら 3 つのケースでは、ほとんどの場合、正しい答えは、より高い max_connections ではなく、アプリケーションと Postgres の間に位置するプーラーです。 の PgBouncer、Supavisor、および PgCat の比較 では 3 つのオプションについて詳しく説明しており、トランザクション モードの ガイド では、プーラーが導入された後の最も一般的な妥協について説明しています。接続以外のすべての Postgres チューニングについては、 実稼働 Postgres チューニング チェックリストを参照してください。

#
よくある質問

よくある質問

PostgreSQL のデフォルトの max_connections は何ですか?+
100、デフォルトでスーパーユーザー用に 3 つの接続が予約されています (superuser_reserved_connections)。このデフォルトは、プーラーを通過する多くのアプリケーションに適していますが、アプリケーション プロセスのフリートがそれぞれ独自の接続バッチを開くとすぐに、プーリングなしではすぐに不十分になります。
PostgreSQLを再起動せずにmax_connectionsを変更できますか?+
いいえ。max_connections はポストマスター コンテキスト パラメータです。Postgres は起動時にこれを 1 回読み取り、共有メモリのサイズを設定します。 ALTER SYSTEM SET は新しい値を postgresql.auto.conf に書き込みますが、その値はサーバーを完全に再起動した場合にのみ適用されます。リロードや SIGHUP だけでは十分ではありません。
アイドル状態の PostgreSQL 接続はどれくらいのメモリを消費しますか?+
単一の正式な数値はありません。それは、work_mem、shared_buffers、およびセッションごとにロードされる拡張機能によって異なります。ただし、文書化されているのは、work_mem は接続ごとではなく、クエリ内の並べ替えまたはハッシュ操作ごとに割り当てられるということです。したがって、単一の複雑なクエリは、単一のアクティブな接続上で work_mem を複数回消費する可能性があります。
常に、より高い max_connections よりも PgBouncer のようなプーラーを優先すべきでしょうか?+
ほとんどの場合、実際のクライアント接続数が PostgreSQL wiki の式で計算された理想的な同時実行数を大幅に超えるとすぐに、そのようになります。トランザクション モード プーラーは、アプリケーション側の非常に多数の論理接続の間に少数の物理接続をプールします。どちらを選択するかについては、PgBouncer、Supavisor、PgCat の比較を参照してください。
(コア × 2) + 効率的なディスクの計算式は正確に何を測定するのでしょうか?+
これは、理想的なアクティブな同時実行性を推定します。これは、max_connections で開く接続の合計数ではなく、特定のサーバーの CPU とディスクがスループットを低下させることなく並行して処理できるリクエストの数です。これは、公式 PostgreSQL プロジェクト Wiki で文書化されている、測定によって検証される開始点であり、厳密な制限ではありません。
Postgres サーバーが接続制限に近づいているかどうかを確認するにはどうすればよいですか?+
pg_stat_activity をクエリし、アクティブ状態の接続数とアイドル状態の接続数を比較します。 max_connections の上限に近い多数のアイドル接続があり、その背後にアクティブなリクエストがない場合は、ほとんどの場合、max_connections をさらに増やす必要があるのではなく、プールする必要があることを示しています。

導入の準備はできていますか?

5 分でバックエンドが完成します。

クレジット カードは不要 · 500 MB 無料 · 50,000 MAU