Performance levels
| Level | VPUs/GB | Typical use |
|---|---|---|
| Lower Cost | 0 | Large sequential, throughput-heavy, infrequent access (logs, backups staging) |
| Balanced | 10 | Default. Most boot volumes and general workloads |
| Higher Performance | 20 | Databases, busy application servers |
| Ultra High Performance | 30–120 | Demanding databases needing very high IOPS/low latency |
Performance scales with both VPUs/GB and volume size, up to per-volume maximums. Higher VPUs cost more per GB per month. Check the current IOPS/throughput per GB tables.
1. Measure actual use
Block volume metrics in OCI Monitoring (oci_blockstore namespace), 30 days:
VolumeReadOps[1m]{resourceId = "<volume-ocid>"}.rate().percentile(0.95)
VolumeWriteOps[1m]{resourceId = "<volume-ocid>"}.rate().percentile(0.95)
VolumeReadThroughput[1m]{resourceId = "<volume-ocid>"}.rate().max()
VolumeThrottledIOs[1m]{resourceId = "<volume-ocid>"}.sum()
Compare against the level's capability for that volume size:
| Finding | Action |
|---|---|
| Throttled I/Os at peaks | Raise VPUs (or size), or enable performance-based auto-tune |
| Usage far below Balanced capability, mostly sequential | Try Lower Cost |
| Database volume at Balanced with latency complaints | Higher Performance |
2. Change the level online
oci bv volume update --volume-id $VOL --vpus-per-gb 20
VPU changes apply online, without detaching the volume (there may be limits on how often you change them). Boot volumes can be changed too:
oci bv boot-volume update --boot-volume-id $BOOT --vpus-per-gb 10
3. Auto-tune
| Policy | What it does |
|---|---|
| Detached volume auto-tune | When a volume is detached, it drops to Lower Cost automatically and returns to its configured level when attached again |
| Performance-based auto-tune | Scales VPUs up (to a maximum you set) when the volume is busy, and back down to the configured level when quiet |
oci bv volume update --volume-id $VOL --autotune-policies \
'[{"autotuneType": "DETACHED_VOLUME"}, {"autotuneType": "PERFORMANCE_BASED", "maxVpusPerGB": 30}]'
Set the base level for normal load and let performance-based auto-tune cover month-end or batch peaks, rather than paying for peak performance all month.
4. Don't forget the instance limits
Each instance shape has a maximum block storage bandwidth and IOPS, which also depend on the number of OCPUs on flexible shapes. A fast volume on a small instance is capped by the instance. For high IOPS, check:
- Instance network bandwidth (it scales with OCPUs).
- iSCSI vs paravirtualized attachment (paravirtualized can have lower performance for very high IOPS; Ultra High Performance has its own attachment requirements, multipath for iSCSI).
5. Size vs VPUs
Performance grows with size. Sometimes a slightly larger volume at Balanced costs less than the same size at Higher Performance for the IOPS you need. Compare both options with the pricing calculator.
6. Clean up
- Volumes in
AVAILABLEstate not attached to anything (with detached auto-tune they at least cost less, but still cost). - Old volume clones used for testing.
Tip
Turn on detached-volume auto-tune by default for all new volumes (Terraform module default). It costs nothing in performance and catches the forgotten volume left behind after a migration.
Checklist
- IOPS, throughput and throttling measured per volume
- Level chosen per volume role
- Detached auto-tune on all volumes
- Performance-based auto-tune for peaky volumes
- Instance-side limits checked
- Unattached volumes reviewed