giip
SES Proposal
AWSサイジング性能コストRDSフェイルオーバー

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

そのまま実行できるコマンド

List the current instance class and storage configuration参照のみ
対象
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.

Get CPU utilization as percentiles, not just an average参照のみ
対象
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 table

Judging 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.

Pull all the metrics needed for a sizing decision at once参照のみ
対象
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
done

If 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.

Change the instance class (involves a restart / failover)
対象
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-immediately

Adding `--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 utilizationConsistently high p95 means CPU-bound. A low average but a high Maximum alone likely points to a specific batch job
FreeableMemoryFreeable memory amount (bytes)A persistently small value means memory-bound. The buffer pool may not be able to hold the working set
ReadIOPS / WriteIOPSRead/write I/O operations per secondWhether the sum is pegged at the provisioned IOPS — if so, adding CPU will not help
ReadThroughput / WriteThroughputRead/write bytes per secondWhether the sum is close to the instance class's EBS bandwidth ceiling — check the ceiling in the current AWS documentation
DatabaseConnectionsNumber of connectionsIf near the limit, the cause is often connection pool design rather than sizing
DBInstanceClassThe current instance classWhen using a license-included model for SQL Server, compare the total cost on the premise that the license fee is tied to vCPU count
MultiAZWhether a standby existsIf 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

考えられる原因(可能性の高い順)

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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. 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. 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. 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. 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. 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. 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).

バージョン・環境による違い

Amazon AuroraAurora separates the storage layer, and one writer plus multiple readers is the standard setup. As with RDS, the writer cannot be horizontally split, and write scaling depends on the writer's size.
Amazon RDS for SQL ServerThe cost of the license-included model is tied to vCPU count. Check both the current AWS documentation and your license agreement for BYOL eligibility and edition-specific constraints.
Multi-AZ DB clustersA Multi-AZ DB instance (one standby) and a Multi-AZ DB cluster (two readable standbys) differ in failover behavior and whether read distribution is possible. Check support for your target engine and version.

これで解決しない場合に確認すること

  • 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エージェントと人間の専門家が継続的に監視・運用しています。

関連するナレッジ

関連サービス

Get a consultation on your RDS instance configuration

同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。

Get a consultation on your RDS instance configuration

ナレッジベース一覧へ