Aurora MySQL のmax_connectionsのデフォルト値はどうやって決まっているのか調べてみた
はじめに
AWS RDS を使用していると、各インスタンスタイプでmax_connections
の値が自動的に設定されています。例えば、Aurora MySQL のdb.t4g.medium
ではmax_connections
が 90 に設定されますが、なぜこの値になるのでしょうか?
本記事では、AWS の公式ドキュメントと実際の計算式を基に、この謎を解明します。
結論(先に知りたい方向け)
db.t4g.medium の max_connections=90 は、以下の計算で決まります:
- 物理メモリ: 4.0 GiB
- OS・RDS 管理プロセス用: 1.0 GiB (25%のオーバーヘッド)
- DBInstanceClassMemory: 3.0 GiB (データベースが実際に使用可能なメモリ)
-
計算式:
log₂(3.0GiB ÷ 768MiB) × 45 = log₂(4) × 45 = 2 × 45 = 90
1. max_connections の計算式
AWS では、Aurora MySQL の max_connections を以下の計算式で決定します:
GREATEST({log(DBInstanceClassMemory/805306368)*45}, {log(DBInstanceClassMemory/8187281408)*1000})
この式は、2 つの計算結果のうち大きい方を採用する仕組みです。
2. 定数値の意味
805,306,368 とは?
- 768 MiB = 768 × 1024 × 1024 = 805,306,368 bytes
- 小〜中規模インスタンス用の基準メモリサイズ
8,187,281,408 とは?
- 7.625 GiB = 7.625 × 1024 × 1024 × 1024 = 8,187,281,408 bytes
- 大規模インスタンス用の基準メモリサイズ
つまり計算式は以下のように書き換えられます:
GREATEST({log(DBInstanceClassMemory/768MiB)*45}, {log(DBInstanceClassMemory/7.625GiB)*1000})
3. DBInstanceClassMemory とは何か?
AWS 公式ドキュメントによると:
DBInstanceClassMemoryは、データベースプロセスで利用可能なメモリのバイト数を返します。この数値は、DB インスタンスクラスの総メモリ量から開始して内部的に計算されます。この計算では、オペレーティングシステムとインスタンスを管理する RDS プロセスのために予約されたメモリが差し引かれます。
重要な点:
- DBInstanceClassMemory は物理メモリより少ない値
- OS・RDS 管理プロセス用のメモリが差し引かれる
- 実際にデータベースが使用できるメモリ量を表す
4. log 関数の正体
AWS 公式ドキュメントには重要な記述があります:
The
log
function represents log base 2.
つまり、計算式では 底が 2 の対数(log₂) が使用されています。
5. db.t4g.medium での実際の計算
db.t4g.medium の仕様
- 物理メモリ: 4 GiB = 4,294,967,296 bytes
90 になるために必要な DBInstanceClassMemory を逆算
第 1 項で 90 になる条件:
log₂(DBInstanceClassMemory/768MiB) × 45 = 90
log₂(DBInstanceClassMemory/768MiB) = 2
DBInstanceClassMemory/768MiB = 2² = 4
DBInstanceClassMemory = 768MiB × 4 = 3,072MiB = 3.0GiB
メモリ配分の計算
- 物理メモリ: 4.0 GiB
- DBInstanceClassMemory: 3.0 GiB
- OS・RDS 管理プロセス用: 1.0 GiB(25%のオーバーヘッド)
検証
log₂(3,221,225,472 ÷ 805,306,368) × 45
= log₂(4.0) × 45
= 2.0 × 45
= 90 ✓
6. なぜ対数を使うのか?
対数を使用する理由は、メモリサイズに対する適切なスケーリングです:
メモリ(MiB) | 比率 | log₂(比率) | ×45 の結果 |
---|---|---|---|
768 | 1.0 | 0.0 | 0 |
1,536 | 2.0 | 1.0 | 45 |
3,072 | 4.0 | 2.0 | 90 |
6,144 | 8.0 | 3.0 | 135 |
対数の特徴:
- メモリが 2 倍になっても接続数は 2 倍にならない
- 大きなメモリほど増加率が緩やか
- リソース使用量に対して適切なバランスを実現
7. 設計思想
2 つの計算式の役割分担
-
第 1 項:
log₂(DBInstanceClassMemory/768MiB) × 45
- 小〜中規模インスタンス向け
-
第 2 項:
log₂(DBInstanceClassMemory/7.625GiB) × 1000
- 大規模インスタンス向け
GREATEST 関数の意味
より大きな値(より適切な接続数)を自動選択し、インスタンスサイズに応じた最適化を実現します。
まとめ
db.t4g.medium の max_connections=90 は偶然の値ではなく、以下の設計に基づいた計算結果です:
- 物理メモリ 4GiBからシステムオーバーヘッドを差し引き
- 実際の DB 利用可能メモリ 3GiBを算出
- 数学的に最適化された計算式を適用
- 結果として 90という適切な接続数を導出
この仕組みにより、AWS は各インスタンスタイプに対して、メモリ使用量とパフォーマンスのバランスを考慮した最適な max_connections 値を自動設定しているのです。
Discussion