Chapter 45 · Amazon Opensearch Service
Subchapter 45.39
references/sizing.mdMarkdown11 KBView on GitHub
The summary version (default starting point + key knobs) is in SKILL.md. This file owns the full formulas, instance-family details, JVM/heap mechanics, k-NN memory math, OCU model, and edge-case tuning.
min_storage = source_data × (1 + replicas) × (1 + indexing_overhead) / (1 - linux_reserved) / (1 - aos_overhead)Defaults (from AWS bp-storage.html):
linux_reserved = 0.05 (Linux reserves 5% of file system for root)aos_overhead = 0.20 capped at 20 GiB/instance (AOS reserves 20% up to 20 GiB)indexing_overhead ≈ 0.10 (the index up to 10% of source data)Simplified rule: min_storage ≈ source_data × (1 + replicas) × 1.45.
For >1 PB workloads, see petabyte-scale.html: 100 GiB shards on OR1.16xlarge.search / i3.16xlarge.search.
Source: bp-sharding.html and bp.html.
| Workload | Target shard size |
|---|---|
| Search workloads | 10–30 GiB |
| Logs / write-heavy | 30–50 GiB |
| Petabyte-scale on i3.16xl / OR1 | up to 100 GiB |
Formulas:
primary_shards = (source + room_to_grow) × 1.1 / desired_shard_size, rounded up to multiple of data-node countshards_per_node ≤ 25 × GiB_heap — e.g., 32 GiB heap = max 800 shards/nodeshard_to_cpu ≈ 1.5 vCPU / shard (initial scale point)Per-node shard cap evolution:
| Rule | Value | Source |
|---|---|---|
| Heap size | 50% of RAM, capped at 32 GiB | auto-tune.html, cloudwatch-alarms.html |
| Customer-tunable? | NO — set automatically per instance class | AWS doc |
| Compressed-oops ceiling | 32 GiB JVM limit | JVM behavior |
| Pressure write-block trigger | JVMMemoryPressure > 92% for 30 min | handling-errors.html |
| Pressure write-block release | JVMMemoryPressure ≤ 88% for 5 min | handling-errors.html |
| Steady-state target | < 80% | bp.html |
Why 32 GiB ceiling: Above ~32 GiB, JVM disables compressed object pointers (compressed oops), and pointer overhead doubles, eroding any RAM gains.
Beyond 32 GiB RAM: scale horizontally (more nodes), not vertically. The service supports up to 64 GiB RAM single-instance, then enforces horizontal scaling.
bp.html)bp.html)bp.html)Terminology: this skill uses cluster manager (the modern OpenSearch name; formerly “master node” in pre-2.x ES / OS). AWS APIs and CLI flags retain the legacy spelling — e.g.,
--dedicated-master-enabled,DedicatedMasterCountinaws opensearch create-domain— and are quoted verbatim where they appear. Prose uses “cluster manager”.
Default rule: Graviton r-family (r7g/r8g) for memory-bound search, m-family (m7g/m8g) for cluster managers; OR1/OR2 for write-heavy logs only (write-once read-rare profile). Pick previous-gen (r6g/r6gd) only with explicit justification — existing RIs, specific compatibility need.
For the current list of supported instance types, EBS+Instance-Store profiles, regional availability, and the full denylist of families incompatible with VPC encryption-at-rest, see supported-instance-types.html (opens in a new tab). Do NOT replicate that list here — it changes quarterly.
Stable architectural notes (sizing-relevant):
t3.*) is dev-only — CPU credits exhaust under sustained load.Common Graviton search-instance specs (canonical RAM/vCPU; do NOT rederive — these are fixed):
| Instance | vCPU | RAM (GiB) | EBS bandwidth |
|---|---|---|---|
r7g.large.search | 2 | 16 | up to 5 Gbps |
r7g.xlarge.search | 4 | 32 | up to 5 Gbps |
r7g.2xlarge.search | 8 | 64 | up to 10 Gbps |
r7g.4xlarge.search | 16 | 128 | up to 12 Gbps |
r7g.8xlarge.search | 32 | 256 | 12 Gbps |
r7g.12xlarge.search | 48 | 384 | 20 Gbps |
m7g.medium.search | 1 | 4 | up to 12.5 Gbps |
m7g.large.search | 2 | 8 | up to 12.5 Gbps |
m7g.xlarge.search | 4 | 16 | up to 12.5 Gbps |
When deriving cluster topology, look up the RAM from this table — do NOT estimate it (r7g.2xlarge.search has 64 GiB RAM, not 16; r7g.4xlarge.search has 128 GiB, not 32). For instance families not listed (OR1, OR2, im4gn, etc.) verify against supported-instance-types.html (opens in a new tab).
uw.medium cannot host k-NN graphs (lacks RAM headroom); use ultrawarm1.large for k-NN-on-warm.For FAISS HNSW float vectors with m=16:
bytes_per_vector ≈ 1.1 × (4 × dim + 8 × m)
total_memory ≈ bytes_per_vector × num_vectors × (1 + replicas)| Vectors | Dim | Memory (replicas=1) | Notes |
|---|---|---|---|
| 1M | 384 | ~3.5 GB | Small workload |
| 1M | 768 | ~6.7 GB | BERT-class |
| 10M | 768 | ~67 GB | Multi-node |
| 100M | 768 | ~670 GB | Multi-node + maybe PQ |
| 1M | 1536 | ~13.4 GB | OpenAI ada-002 |
| 10M | 1536 | ~134 GB | Multi-node |
Native-index circuit breaker: default 50% of non-heap RAM. Verify against current knn-index/ doc for the exact percentage.
Engine impact:
m=16 typicalmode: "on_disk": graphs paged from disk; lower memory pressure, higher latencyuw.medium for in-memory k-NN engines — instance lacks RAM headroom for k-NN graphsknn.memory.circuit_breaker.limit × 61 GiB per uw.largeOS 3.0 introduces GPU-accelerated index build, derived-source vectors (reduced storage + faster cold start), concurrent segment search default-on for k-NN, and star-tree indexing for aggregations. For sizing impact, treat these as memory/storage reductions — verify under load with OpenSearch Benchmark; do not rely on vendor multiplier claims for capacity planning.
| Configuration | Indexing floor | Search floor | Total billed |
|---|---|---|---|
| Redundancy ON (production default) | 1 OCU (0.5 × 2) | 1 OCU (0.5 × 2) | 4 × 0.5 OCU |
| Redundancy OFF (dev/test) | 0.5 OCU × 2 | 0.5 OCU × 2 | 2 × 0.5 OCU per workload type |
For current OCU defaults and account-level caps, see serverless-scaling.html (opens in a new tab).
Vector Search collections CANNOT share OCUs with Search or TimeSeries collections — even with the same KMS key. Adding one vector collection roughly doubles the idle floor. Project both floors via https://calculator.aws.
If vector is exploratory, prefer running k-NN on existing Managed cluster instead of provisioning a separate Serverless Vector collection.
max_units accordingly.osis:Ingest IAM permissionhttps://calculator.aws.Run OpenSearch Benchmark against the target cluster before cutover. The big5 workload is the standard search benchmark. The compare mode produces a baseline-vs-contender diff.
Sizing model addition: data_size × retention_days / 30 × $/GB-mo plus PUT cost.