The Difference Between One Large RDS Instance and Several Smaller Instances
公開日 2026-08-13 · 更新日 2026-08-13 · 最終検証日 2026-08-13
結論
Which is correct cannot be decided from the configuration alone. Since an RDS writer cannot be horizontally split, "several smaller instances" is not a way to automatically distribute write load — it means splitting the database or workload itself. The decision rests on four measurements: the percentile of CPU utilization, how well memory and the buffer pool are keeping up, whether IOPS and throughput are hitting the instance-side ceiling, and whether the workload can actually be separated. Decide the configuration only after measuring these four.
この文書の適用条件
| 対象製品 | Amazon RDS (SQL Server / MySQL / PostgreSQL), Amazon Aurora |
|---|---|
| 確認バージョン | AWS CLI v2 / the public APIs of Amazon RDS and Amazon CloudWatch (based on the specification as of 2026-08-13) |
| 適用環境 | AWS (Amazon RDS, Amazon Aurora) |
| 必要権限 | Read commands require `rds:DescribeDBInstances` and `cloudwatch:GetMetricStatistics`. The change command requires `rds:ModifyDBInstance` |
| 実行影響 | No impact from read commands. Changing the instance class involves a restart and, on Multi-AZ, a failover |
| 再起動 | Required when changing the instance class (a failover occurs on a Multi-AZ configuration) |
| 最終検証日 | 2026-08-13 |
そのまま実行できるコマンド
- 対象
- Amazon RDS (AWS CLI v2)
- 権限
- rds:DescribeDBInstances
- 変更作業
- None (read-only)
- Production実行
- Possible
# 対象: Amazon RDS(AWS CLI v2)
# 権限: rds:DescribeDBInstances
# 変更作業: なし(参照のみ)
# Production 実行: 可能
aws rds describe-db-instances \
--query "DBInstances[].{Id:DBInstanceIdentifier,Class:DBInstanceClass,Engine:Engine,\
MultiAZ:MultiAZ,Storage:AllocatedStorage,StorageType:StorageType,Iops:Iops,\
StorageThroughput:StorageThroughput,License:LicenseModel,ReadReplicas:ReadReplicaDBInstanceIdentifiers}" \
--output table`Iops` and `StorageThroughput` are provisioned values, not actual observed values. Get the actual values with the CloudWatch command below. If `ReadReplicas` is non-empty, reads are already distributed.
- 対象
- Amazon CloudWatch (namespace AWS/RDS)
- 権限
- cloudwatch:GetMetricStatistics
- 変更作業
- None (read-only)
- Production実行
- Possible
# 対象: Amazon CloudWatch(名前空間 AWS/RDS)
# 権限: cloudwatch:GetMetricStatistics
# 変更作業: なし(参照のみ)
# Production 実行: 可能
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name CPUUtilization \
--dimensions Name=DBInstanceIdentifier,Value=db-sample-instance \
--start-time 2026-08-06T00:00:00Z \
--end-time 2026-08-13T00:00:00Z \
--period 300 \
--statistics Average Maximum \
--extended-statistics p95 p99 \
--output tableJudging sizing from the average alone misreads a configuration that saturates at peak as "having headroom." A `--period 300` (5-minute) average smooths out the spike within that window, so always check `p95`/`p99` together with `Maximum`. Re-pull with a time range that includes the busy period.
- 対象
- Amazon CloudWatch (namespace AWS/RDS)
- 権限
- cloudwatch:GetMetricStatistics
- 変更作業
- None (read-only)
- Production実行
- Possible
# 対象: Amazon CloudWatch(名前空間 AWS/RDS)
# 権限: cloudwatch:GetMetricStatistics
# 変更作業: なし(参照のみ)
# Production 実行: 可能
for M in ReadIOPS WriteIOPS ReadThroughput WriteThroughput FreeableMemory DatabaseConnections
do
echo "===== $M ====="
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name "$M" \
--dimensions Name=DBInstanceIdentifier,Value=db-sample-instance \
--start-time 2026-08-06T00:00:00Z \
--end-time 2026-08-13T00:00:00Z \
--period 300 \
--statistics Average Maximum \
--output text
doneIf the sum of ReadIOPS and WriteIOPS is pegged at the provisioned IOPS, adding CPU won't improve throughput. The same applies if the sum of ReadThroughput and WriteThroughput (bytes/sec) is pegged at the instance class's EBS bandwidth ceiling. Since the ceiling differs by instance class, check the current AWS documentation for the target class's value.
- 対象
- Amazon RDS (AWS CLI v2)
- 権限
- rds:ModifyDBInstance
- 変更作業
- Yes (instance class change → restart / failover on Multi-AZ)
- Production実行
- Possible, but decide the maintenance window and rollback procedure first
# 対象: Amazon RDS(AWS CLI v2)
# 権限: rds:ModifyDBInstance
# 変更作業: あり(インスタンスクラス変更 → 再起動 / Multi-AZ ではフェイルオーバー)
# Production 実行: 可能だが接続断が発生する。メンテナンス枠内で実施すること
aws rds modify-db-instance \
--db-instance-identifier db-sample-instance \
--db-instance-class db.r6i.4xlarge \
--no-apply-immediatelyAdding `--no-apply-immediately` applies the change at the next maintenance window. `--apply-immediately` triggers an immediate restart, so use it only during a window where a connection drop is acceptable. Before changing, confirm with `aws rds describe-orderable-db-instance-options` that the target class is selectable for your engine, version, and region.
結果の読み方
| 列 | 意味 | 確認するポイント |
|---|---|---|
| CPUUtilization (p95 / p99 / Maximum) | vCPU utilization | Consistently high p95 means CPU-bound. A low average but a high Maximum alone likely points to a specific batch job |
| FreeableMemory | Freeable memory amount (bytes) | A persistently small value means memory-bound. The buffer pool may not be able to hold the working set |
| ReadIOPS / WriteIOPS | Read/write I/O operations per second | Whether the sum is pegged at the provisioned IOPS — if so, adding CPU will not help |
| ReadThroughput / WriteThroughput | Read/write bytes per second | Whether the sum is close to the instance class's EBS bandwidth ceiling — check the ceiling in the current AWS documentation |
| DatabaseConnections | Number of connections | If near the limit, the cause is often connection pool design rather than sizing |
| DBInstanceClass | The current instance class | When using a license-included model for SQL Server, compare the total cost on the premise that the license fee is tied to vCPU count |
| MultiAZ | Whether a standby exists | If true, a class change becomes a cutover operation that involves a failover |
こういう状況で使います
- CPU utilization stays high at peak, and it is unclear whether to add capacity or consolidate
- Proposals such as "3 × 8xlarge" vs. "2 × 12xlarge" are on the table with no agreed basis for comparison
- Increasing the instance size didn't speed things up as much as expected
- Consolidating onto one instance means a single failure now stops the entire system at once
- Increasing the instance size on SQL Server RDS raised the total cost more than expected
考えられる原因(可能性の高い順)
01
The premise that a writer cannot be horizontally split is not shared
RDS read replicas can only scale out read processing. RDS has no mechanism that automatically distributes a single write workload across multiple instances. So choosing "several smaller instances" always comes with a design decision to split the workload by database or by function.
02
The bottleneck is not CPU
If something other than CPU — an IOPS ceiling, an EBS throughput ceiling, lock contention, a single-threaded batch job — is the limiting factor, raising the instance class just leaves vCPUs idle. Deciding size without measuring what the limiting factor actually is leads to this situation.
03
Resources that scale with instance size are mixed with ones that do not
vCPU, memory, network bandwidth, and EBS bandwidth broadly increase with instance size, but not at the same rate. Provisioned IOPS on storage is also set independently of the instance class and does not increase just by raising the class.
04
The license billing model has not been factored in
Under SQL Server's license-included model, the license fee is tied to vCPU count. Even with the same total vCPU count, a different number-of-instances configuration can change the minimum configuration or redundancy approach per instance, so the total cost comparison is not a simple sum. Always calculate the amount with the AWS Pricing Calculator and your own contract terms.
05
Blast radius hasn't been treated as a design dimension
The more you consolidate onto one instance, the wider the impact of that single instance's failure, maintenance, or a parameter-change mistake. Conversely, adding instances narrows the impact radius while increasing the sheer number of opportunities for a failure. When availability requirements differ by business function, the axis for a split decision is blast radius, not cost.
確認手順
- 1
List the current configuration
参照のみUse `aws rds describe-db-instances` to check the class, storage type, provisioned IOPS, Multi-AZ status, and the presence of read replicas.
- 2
Measure CPU as percentiles
参照のみPull CPUUtilization's p95, p99, and Maximum over a period that includes the busy season. The average alone is not enough to judge.
- 3
Measure memory sufficiency
参照のみLook at the trend of FreeableMemory together with the engine's buffer cache hit ratio. If the hit ratio is low and FreeableMemory is also small, memory is the limiting factor.
- 4
Check whether I/O is hitting a ceiling
参照のみCompare ReadIOPS+WriteIOPS against the provisioned IOPS, and ReadThroughput+WriteThroughput against the EBS bandwidth ceiling of the instance class. Refer to current AWS documentation for the ceiling values.
- 5
Inventory whether the workload can be separated
参照のみIdentify cross-database queries, shared master tables, and any distributed transactions. The more cross-cutting processing there is, the higher the cost of splitting.
- 6
Test candidate configurations
低Run a production-equivalent workload against a test instance restored from a snapshot, and measure how the metrics change on candidate classes. Avoid trial and error in production.
対応方法
すぐに実施できる低リスクの対応
Identify a single limiting factor
参照のみNarrow it down to one of CPU, memory, IOPS, throughput, or locking through measurement. No conclusion can be reached by comparing configuration options until this is settled.
Consider offloading read load to a read replica
低If reporting or read-heavy load is large, moving it to a read replica can have less impact than growing the writer. This only applies to processing that can tolerate replica lag.
事前検討が必要な変更
Review the storage-side ceiling first
中If I/O is the limiting factor, reviewing the storage type, provisioned IOPS, and storage throughput comes before the instance class. This can have less impact than changing the instance class.
Build a plan to split by workload
中If you choose to split, design the split unit (by business system or by schema), how to replace cross-cutting processing, the cutover procedure, and the rollback procedure together.
Estimate the increase in operational work
参照のみAdding instances multiplies the backup window, maintenance window, parameter group, monitoring setup, alerts, and patching — all by the instance count. Include this effort in the configuration comparison.
再起動・サービス影響を伴う変更
Change the instance class
高A class change involves a restart, and a Multi-AZ configuration triggers a failover. Since the cutover time varies by workload and engine, measure it in a test environment first and then decide on the maintenance window.
Separate a database onto its own instance
専門家レビュー必須Moving a DB to a separate instance turns joins that previously completed within the same instance into Linked Server or application-side joins. Since performance characteristics and transaction boundaries change, inventorying the queries to migrate is mandatory.
!注意事項
- This article does not give a conclusion on "which is better," nor any price or savings percentage. Judge cost with the AWS Pricing Calculator and your own contract terms, and performance with your own CloudWatch measurements.
- A read replica is a mechanism for scaling reads — it does not increase write throughput. If writes are the limiting factor, adding instances does not solve it.
- Changing the instance class involves a restart. A Multi-AZ configuration triggers a failover, and its duration varies by environment. Do not assume a figure — measure it in a test environment before building the cutover plan.
- Splitting a database turns a join within the same instance into a Linked Server or application-side join. This adds a network round trip, changing the execution plan and performance characteristics, and may require a distributed transaction.
- As the instance count grows, backups, maintenance windows, parameter groups, and monitoring setup all multiply by that count. Include this operational effort in the configuration comparison.
- CloudWatch's standard-resolution metrics average over the period. A short spike gets smoothed out, so use `Maximum` together with extended statistics (p95, p99).
バージョン・環境による違い
これで解決しない場合に確認すること
Check wait events inside the engine
If things are slow without CPU or I/O hitting a ceiling, lock waits, latch waits, or network waits may dominate. This isn't an instance-size problem.
Check whether a single query is limited to a single thread
If a huge batch job isn't parallelized, adding vCPUs won't shrink its runtime. Check the query-side parallelism setting first.
Check the connection pool configuration
If DatabaseConnections is near its limit, the cause may be the application-side pool configuration rather than instance size.
Cross-check storage's provisioned value against the measured value
If the measured value is always well below the provisioned IOPS, storage is not the limiting factor. If it's pegged, changing the class won't help.
Identify cross-cutting processing that will be needed after splitting
Check whether nightly batch jobs or aggregation processing span multiple databases, based on running queries and job definitions.
この文書の根拠と限界
製品の公式ドキュメントに基づく説明
A general decision procedure based on the public specifications of Amazon RDS instance classes, Multi-AZ, and read replicas, and the public specifications of Amazon CloudWatch's AWS/RDS namespace metrics (CPUUtilization, ReadIOPS, WriteIOPS, ReadThroughput, WriteThroughput, FreeableMemory, DatabaseConnections). It does not include per-instance-class ceiling values, pricing, or any specific environment's measurements.
よくある質問
Which is better, 3 × 8xlarge or 2 × 12xlarge?
It cannot be decided from the configuration alone. Even with the same total vCPU count, the conclusion flips depending on whether the write workload can be separated. If it cannot, a larger instance is favorable because the per-instance ceiling matters; if it can be cleanly separated by business function, several instances have the advantage of a narrower blast radius. First measure CPU p95, FreeableMemory, and how close IOPS and throughput are to their ceilings.
Does adding more RDS instances improve write performance?
No. RDS has a single writer, and read replicas only distribute reads. To distribute writes, you need to split the database or workload itself as an application design decision.
For SQL Server, what happens to the license cost if you split into more instances?
The cost of the license-included model is tied to vCPU count. It looks like a simple comparison is possible when the total vCPU count is the same, but in practice the minimum configuration and redundancy approach per instance change the total. Calculate the amount with the AWS Pricing Calculator and your own contract terms — this article does not give pricing.
Does raising the instance class always make things faster?
No. If the limiting factor is storage's provisioned IOPS or lock contention, adding vCPU and memory will not help. Before changing the class, pin down which single factor among CPU, memory, IOPS, throughput, or a wait event is hitting its ceiling.
Can this be run in production?
`describe-db-instances` and `get-metric-statistics` are read-only and can be run as-is in production. A class change via `modify-db-instance` involves a restart and failover, so decide the maintenance window and rollback procedure before carrying it out.
What happens to cross-database queries after splitting?
On SQL Server, they get replaced by a Linked Server or an application-side join. Either way, a network round trip is added and the execution plan changes, so identify "cross-cutting processing" before splitting and verify the post-replacement performance in a test environment.
この文書がカバーする質問
- What determines throughput on RDS SQL Server
- Which is better, 3 × 8xlarge or 2 × 12xlarge
- Does adding RDS instances also speed up writes
- Should the database be split or consolidated onto one instance
リスク表示の意味
- 参照のみデータと設定を変更しません。
- 低影響は限定的ですが、権限と負荷の確認が必要です。
- 中性能・ロック・コストに影響する可能性があります。
- 高障害・データ損失・復旧作業が発生する可能性があります。
- 専門家レビュー必須本番適用前に別途レビューが必須です。
GIIPの対応範囲
The sizing decision itself is a one-time task once you have the measurements. What is hard is everything after that. The workload changes as the business grows, and a configuration that was right six months ago is not guaranteed to still be right today. At GIIP, an AI agent continuously collects CPU, memory, and I/O metrics for several databases on AWS and Azure and roughly 30 web services, and a human specialist judges whether a configuration review is needed once a trend approaches a ceiling. This treats sizing not as a one-off consultation but as ongoing work that starts from trend monitoring.
執筆・技術検証
GIIP プロダクション運用チーム
大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。
What to Check When Reviewing AWS Database Costs
A checklist for reviewing AWS database spend in order of increasing impact: stop what is unused → right-size → storage → backups → non-production → commitments.
infrastructureWhat's the Difference Between EBS IOPS and Physical Disk IOPS
A document organizing why EBS IOPS cannot be compared directly to physical disk IOPS, based on where the ceiling applies (volume vs. instance) and how to measure it.
infrastructureRandom IOPS vs. Sequential IOPS, and How to Read Benchmark Results
A document organizing why an IOPS figure cannot be compared without I/O size, queue depth, and read/write ratio, and how to build measurement conditions with fio.
sql-serverCauses and Checks for Msg 7356 on a Linked Server in SQL Server
Msg 7356 signals that column metadata disagreed between compile time and run time. This organizes how to isolate the cause and how to work around it using pass-through queries.
関連サービス
Get a consultation on your RDS instance configuration
同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。
Get a consultation on your RDS instance configuration