【RDS for PostgreSQL】インスタンスクラスを変えると max_connections のデフォルト値がどう変わるか検証してみた

【RDS for PostgreSQL】インスタンスクラスを変えると max_connections のデフォルト値がどう変わるか検証してみた

RDS for PostgreSQL のデフォルト `max_connections` がインスタンスクラスのメモリからどう決まるのか、実際に複数のクラスで確認して検証してみました。計算式と実測値の違いも明らかにします。
2026.10.14

はじめに

RDS for PostgreSQL では、max_connections のデフォルト値がインスタンスクラスのメモリ量から自動で決まります。
本記事では、インスタンスクラスを変更しながら実際の値を確認し、計算式と比べてみます。

3行まとめ

  • RDS PostgreSQL の max_connections デフォルト値は LEAST({DBInstanceClassMemory/9531392}, 5000) で決まり、インスタンスクラスのメモリに比例して増える
  • インスタンスクラスの総メモリで計算した値より、実測値は小さくなる(db.t3.small: 計算225 → 実測191)
  • 実測値から逆算すると、DB が実際に使えるメモリ量(DBInstanceClassMemory)の目安がわかる

(環境準備) RDS と EC2 の作成

以下構成でRDSを作成します。また、RDS へアクセスするため、RDS インスタンスと同じ VPC に EC2 も作成しておきます。(EC2 から psql -h <エンドポイント> -U postgres で接続)

  • RDS PostgreSQL 17.10
  • プライベートサブネットへ配置
  • デフォルトパラメータグループを使用
  • db.t3.small
  • (検証のため)EC2 からアクセスできるようセキュリティグループを設定

やってみた

前提として、デフォルトパラメータグループにおける max_connections の値は以下の式で求められます。

LEAST({DBInstanceClassMemory/9531392},5000)


デフォルトパラメータグループの画像

  • DBInstanceClassMemory (Byte):DB インスタンスクラスのメモリ量から、RDS やOSが管理用に予約している分を差し引いた、データベースプロセスが使える メモリ量(バイト)。(正確な値は非公表)
  • 9531392 (Byte):この式で使われる定数(約9.5 MB)
  • LEAST(...,5000):計算結果と 5000 のうち小さい方を採用するため、上限は 5000 になります。

DBInstanceClassMemory
データベースプロセスに対し、使用可能なメモリのバイト数を整数で返します。この数値は、DB インスタンスクラスの合計メモリ量から始めて内部的に計算されます。この数から、インスタンスを管理する RDS プロセスとオペレーティングシステム用に予約されているメモリ量を減算します。したがって、この数値は、「 DB インスタンスクラス」のインスタンスクラステーブルに示されているメモリ値よりも、常にやや低くなります。正確な値は、複数の要因の組み合わせによって異なります。

DB パラメータの指定 - Amazon Relational Database Service

LEAST
整数またはパラメータ式のリストから最小値を返します。

DB パラメータの指定 - Amazon Relational Database Service

以下にて、インスタンスクラスを変更していきながら、max_connections がどう変化するのか見ていきます。

db.t3.small

現在の RDS のインスタンスクラスは db.t3.small となっています。

db.t3.small の総メモリは 2 GiB です。(参考: DB インスタンスクラスのハードウェア仕様)
式の DBInstanceClassMemory は公開されていないので、代わりに総メモリを入れて計算してみます。

2 GiB = 2,147,483,648 バイト

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)
                ≈ LEAST({2,147,483,648/9,531,392}, 5000)
                ≈ LEAST(225.3, 5000)
                = 225

※ 実際に式に入るのは総メモリより少し小さい `DBInstanceClassMemory` です。そのため、 225 は上限の目安になります。

実際に RDS に接続して SHOW max_connections; を実行すると、191 でした。
前述の計算上では 225 だったので、差が出ています。

postgres=> SHOW max_connections;
 max_connections 
-----------------
 191
(1 row)

上記結果から逆算すると、DBInstanceClassMemory は次の範囲にあったと推定できます。(※整数の切り捨てを前提とした推測)

DBInstanceClassMemoryを求める
191 ≤ DBInstanceClassMemory ÷ 9,531,392 < 192
→ 約 1,820,495,872 〜 1,830,027,264 バイト(約 1736〜1745 MiB)

db.t3.medium

続いて、インスタンスクラスを db.t3.medium に変更し、同様に検証します。

db.t3.medium の総メモリは 4 GiB です。(参考: DB インスタンスクラスのハードウェア仕様)
small と同じく、総メモリを代入して計算すると次のようになります。

4 GiB = 4,294,967,296 バイト

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)
                ≈ LEAST({4,294,967,296/9,531,392}, 5000)
                ≈ LEAST(450.6, 5000)
                = 450

一方で、実際に RDS へ接続し確認した結果、402 でした。
メモリ容量としては 4 GiB 与えられていても、実際にデータベースプロセスが使える容量は、約 3654〜3663 MiB と推定できました。

postgres=> SHOW max_connections;
 max_connections 
-----------------
 402
(1 row)
DBInstanceClassMemoryを求める
402 ≤ DBInstanceClassMemory ÷ 9,531,392 < 403
→ 約 3,831,619,584 〜 3,841,150,976 バイト(約 3654〜3663 MiB)

db.t3.large

最後にインスタンスクラスを db.t3.large に上げてメモリが 8 GiB の時の max_connections 値を確認します。

small / medium と同様に、まず総メモリを式に代入して計算してみます。

8 GiB = 8,589,934,592 バイト

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)
                ≈ LEAST({8,589,934,592/9,531,392}, 5000)
                ≈ LEAST(901.2, 5000)
                = 901

計算上は 901 になるはずです。実際に RDS に接続して確認してみます。

postgres=> SHOW max_connections;
 max_connections 
-----------------
 841
(1 row)

上記の通り、実測値は 841 で、計算値の 901 より 60 小さい結果になりました。
small(225 → 191)、medium(450 → 402)と同じく、総メモリで計算した値より実測値のほうが小さくなっています。

これまでと同様に逆算すると、DBInstanceClassMemory は次の範囲にあったと推定できます。

DBInstanceClassMemoryを求める
841 ≤ DBInstanceClassMemory ÷ 9,531,392 < 842
→ 約 8,015,900,672 〜 8,025,432,064 バイト(約 7644〜7653 MiB)

8 GiB(8192 MiB)のうち、データベースプロセスが使えるメモリは約 7644〜7653 MiB と推定できます。

終わりに

インスタンスクラスを変えながら max_connections を確認した結果をまとめます。

インスタンスクラス 総メモリ 総メモリで計算した値 実測値
db.t3.small 2 GiB 225 191
db.t3.medium 4 GiB 450 402
db.t3.large 8 GiB 901 841

どのクラスでも、実測値は総メモリで計算した値より小さくなりました。
式の DBInstanceClassMemory が、総メモリから RDS や OS の予約分を引いた値のためです。

実測値から逆算すると、DB が使えるメモリは次の範囲でした。

インスタンスクラス 逆算した DBInstanceClassMemory 総メモリに対する割合
db.t3.small 約 1736〜1745 MiB 約 85%
db.t3.medium 約 3654〜3663 MiB 約 89%
db.t3.large 約 7644〜7653 MiB 約 93%

非公開の DBInstanceClassMemory も、SHOW max_connections; の実測値から逆算すればおおよその範囲を推定する事ができました。
総メモリ ÷ 約 9.5 MB(DBInstanceClassMemory/9531392) は上限の目安として使えますが、実際の値はそれより小さくなる点に注意が必要です。

(※)逆算値は推定値です。今回確認したのは PostgreSQL 17.10 の3クラスのみで、他のクラスやバージョンでは異なる可能性があります。

本記事がどなたかのお役に立てば幸いです。

参考情報

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ParamValuesRef.html
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.Summary.html#hardware-specifications.burstable-inst-classes

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事