Block Volume Performance Tests on Windows-Based Instances

This guide provides a repeatable method to benchmark OCI Block Volume performance and interpret results for Windows and Linux hosts.

1. Purpose

This guide provides a repeatable method to benchmark OCI Block Volume performance and interpret results for Windows and Linux hosts.

Use this guide to:

  • Validate IOPS, throughput, and latency behavior.
  • Compare observed results against expected Block Volume and instance limits.
  • Identify common bottlenecks such as throttling, insufficient queue depth, instance shape limits, attachment configuration, and workload contention.
  • Collect the right evidence before opening a support request.

2. Scope

Consider the following concepts when determining the scope for your tests.

Area In Scope Out of Scope
Performance validation IOPS, throughput, latency testing for OCI Block Volumes and Boot Volumes Application-level tuning, database tuning, non-OCI storage tuning
Tools fio on Linux, DiskSpd on Windows Third-party storage appliance benchmarks
Investigation Interpreting benchmark results and OCI metrics Long-term remediation or incident-specific RCA

3. Safety Warning

Benchmarking can generate high I/O load. Write tests can overwrite data. Before running any command:

  • Use a disposable test volume whenever possible.
  • Do not run write-heavy tests against production data.
  • Do not run raw-device write tests unless the device is dedicated to benchmarking.
  • Confirm the target device or file path before starting the test.
  • Prefer file-level tests for safer validation.
  • Run tests during an approved maintenance or test window if using a production host.

4. Before You Test

Before you test, record the following information.

Check Required Action
Volume identity Record the volume OCID, region, availability domain, size, and performance level.
Instance identity Record the instance OCID, shape, OCPU count, operating system, and attachment type.
Expected limits Check volume size/VPU limits and instance shape limits before interpreting results.
Workload isolation Stop or account for application/background I/O during tests.
Test target Use a dedicated test file or a dedicated raw block device.
Caching Use direct I/O / cache-bypass options in the test tool.
Metrics Capture OCI Block Volume metrics during the exact test window.
Tool version Record fio --version or DiskSpd version.

5. Determine Expected Performance First

Do not conclude that a volume is under performing until expected limits are calculated.

Effective performance is constrained by multiple limits. The effective maximum is the minimum of the following limits:

  • Volume-size-derived limit
  • Volume performance tier / VPU limit
  • Maximum per-volume service limit
  • Instance shape Block Volume IOPS / throughput limit
  • Attachment and multipath configuration limits
  • Guest OS / application / benchmark configuration limits

Example Interpretation

The following table provides example scenarios along with example interpretations of those scenarios.

Scenario Interpretation
Volume can provide 50,000 IOPS, but instance shape supports 25,000 IOPS Expected maximum is 25,000 IOPS because the instance is the bottleneck.
Volume is small and does not have enough size-derived IOPS even at higher VPU Increase volume size or adjust workload expectations.
VolumeThrottledIOs is non-zero during the test Workload is hitting a configured or service-side limit. Validate volume size, VPU, and instance limits.
No throttling, but IOPS is low Check queue depth, threads, attachment type, multipath, guest CPU, filesystem, and competing workload.

Reference: OCI Block Volume Performance

6. Standard Benchmark Profiles

The following table provides suggested values for benchmarking.

Goal Block Size Pattern Queue Depth Threads / Jobs Duration Primary Metric
IOPS 4 KiB Random read or random mixed 64-128 4-8 120s+ IOPS
Throughput 256 KiB Sequential read or mixed 32-64 4-8 120s+ MB/s
Baseline latency 4 KiB Random read 1 1 120s+ avg, p95, p99 latency

Run each test more than once when validating a performance claim. Use the median result and retain latency percentiles.

7. Why I/O Size Matters

The table provides suggested I/O sizes to use during testing.

Test Goal Recommended I/O Size Reason
IOPS 4 KiB Small random I/O is the standard way to measure maximum operations per second.
Throughput 256 KiB or larger Larger I/O sizes transfer more data per operation and better measure bandwidth.
Latency 4 KiB Small I/O with low queue depth measures baseline response time without queueing effects.

Do not compare a 4 KiB random IOPS test to a 256 KiB throughput test as if they measure the same behavior. If the application uses a different I/O size, run an additional workload-specific profile after the standardized baseline test.

8. Why Queue Depth Matters

Queue depth is the number of outstanding I/O requests submitted to the storage path at the same time.

Queue Depth What It Measures When To Use
1 Baseline latency for a single outstanding I/O Latency and application response-time investigation
32-64 Moderate concurrency and throughput Sequential throughput or general validation
64-128+ Saturation behavior and maximum IOPS High-performance random I/O testing

A single thread with queue depth 1 usually cannot drive the maximum IOPS of a high-performance volume because each I/O must complete before the next one is submitted. Higher queue depth keeps multiple I/O requests in flight and is normally required to validate provisioned IOPS or throughput.

High queue depth can also increase latency. Always review p95 and p99 latency when using high queue depth.

9. Linux Benchmarking With fio

Follow these steps to benchmark using fio.

9.1 Identify the Test Device

Use stable identifiers when possible.

lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,MODEL,SERIAL
ls -l /dev/disk/by-id/
                    

Do not assume /dev/sdX is the correct device. Device names can change after reboot or attach/detach operations.

9.2 Check fio Version

To check fio version, use:

fio --version
                    

9.3 IOPS: Read-Only Raw Device Test

This test is read-only but still generates high I/O load.

sudo fio --name=iops-read \
  --filename=/dev/oracleoci/< Device ID : eg . oraclevd1/oraclevd2/oraclevd3... > \
  --direct=1 \
  --rw=randread \
  --bs=4k \
  --ioengine=libaio \
  --iodepth=128 \
  --numjobs=4 \
  --runtime=120 \
  --time_based \
  --group_reporting \
  --readonly

9.4 IOPS: Mixed File-Level Test

This test writes to the specified test file. Do not point it at application data.

sudo mkdir -p /mnt/test
sudo fio --name=iops-randrw \
  --filename=/mnt/test/fio-testfile \
  --size=100G \
  --direct=1 \
  --rw=randrw \
  --rwmixread=50 \
  --bs=4k \
  --ioengine=libaio \
  --iodepth=128 \
  --numjobs=4 \
  --runtime=120 \
  --time_based \
  --group_reporting

9.5 Throughput: Read-Only Raw Device Test

The command tests read throughput.

sudo fio --name=tp-read \
  --filename=/dev/oracleoci/< Device ID : eg . oraclevd1/oraclevd2/oraclevd3... > \
  --direct=1 \
  --rw=read \
  --bs=256k \
  --ioengine=libaio \
  --iodepth=64 \
  --numjobs=4 \
  --runtime=120 \
  --time_based \
  --group_reporting \
  --readonly

9.6 Baseline Latency: Read-Only Raw Device Test

This command tests latency on a read-only device.

sudo fio --name=lat-read \
  --filename=/dev/oracleoci/< Device ID : eg . oraclevd1/oraclevd2/oraclevd3... > \
  --direct=1 \
  --rw=randread \
  --bs=4k \
  --ioengine=libaio \
  --iodepth=1 \
  --numjobs=1 \
  --runtime=120 \
  --time_based \
  --group_reporting \
  --readonly

10. Windows Benchmarking With DiskSpd

Use the official DiskSpd releases: DiskSpd GitHub Releases

10.1 Prepare a Test File

Use a dedicated test file on the target volume. Do not use application data files.

Example using fsutil:

fsutil file createnew D:\testfile.dat 107374182400
                    

This creates a 100 GiB test file.

10.2 IOPS: Random Read

This command performs a random read test.

.\diskspd.exe -d120 -o128 -t8 -Sh -L -b4K -r -w0 D:\testfile.dat
                    

10.3 IOPS: Random Mixed 50/50

This test writes to the test file.

.\diskspd.exe -d120 -o128 -t8 -Sh -L -b4K -r -w50 D:\testfile.dat
                    

10.4 Throughput: Sequential Read

This command tests throughput for sequential reads.

.\diskspd.exe -d120 -o64 -t4 -Sh -L -b256K -si -w0 D:\testfile.dat
                    

10.5 Baseline Latency: Random Read With Single Outstanding I/O

This command tests latency for random reads.

.\diskspd.exe -d120 -o1 -t1 -Sh -L -b4K -r -w0 D:\testfile.dat
                    

10.6 Windows Caveats

Windows results can be affected by filesystem behavior, antivirus scanning, filter drivers, backup agents, and guest CPU saturation. Disable or account for those factors before interpreting results.

11. fio and DiskSpd Parameter Mapping

This table compares fio and DiskSpd parameter options.

Intent fio DiskSpd
Random read --rw=randread -r -w0
Random mixed --rw=randrw --rwmixread=50 -r -w50
Sequential read --rw=read -si -w0
Block size --bs=4k / --bs=256k -b4K / -b256K
Queue depth --iodepth -o
Concurrency --numjobs -t
Runtime --runtime=120 --time_based -d120
Disable cache --direct=1 -Sh
Latency output latency percentiles -L

12. How To Read Results

The following table provides suggestions on what to check for various testing areas.

Result Area What To Check Interpretation
IOPS Total read/write IOPS for the workload Compare against calculated expected IOPS.
Throughput MB/s or MiB/s Compare against calculated expected throughput.
Average latency Mean response time Useful, but can hide tail latency.
p95/p99 latency Tail response time High tail latency can indicate queueing, throttling, noisy workload, or path bottleneck.
CPU usage Guest CPU and system CPU Benchmark can become CPU-bound before storage is saturated.
Throttling VolumeThrottledIOs during test window Nonzero throttling means workload exceeded a limit.

13. Throttling Metrics To Check

Block Volume metrics are emitted in the oci_blockstore metric namespace.

Metric / Signal What It Indicates Interpretation
VolumeThrottledIOs Total I/O operations throttled during the interval Workload is exceeding a configured or service-side limit.
Read/write operations Current IOPS Compare against expected IOPS.
Read/write throughput Current MB/s Compare against expected throughput.
Read/write latency Service response time High latency with throttling suggests saturation; high latency without throttling needs broader investigation.

References:

14. Troubleshooting Low Performance

If your tests indicate low performance, consider the following troubleshooting steps.

Symptom Likely Area What To Check
Low IOPS, low queue depth Test configuration Increase queue depth and thread count for max-IOPS testing.
Low IOPS, high throttling Volume or instance limit Validate volume size, VPU, per-volume limit, and instance shape limit.
Low throughput with small I/O size Test profile Use larger block size such as 256 KiB for throughput testing.
High p99 latency with high queue depth Queueing / saturation Compare against queue depth 1 latency and check throttling.
Low results only during production workload Workload contention Re-test on dedicated volume/host or during quiet window.
UHP volume below expected performance Multipath / attachment Validate UHP prerequisites and multipath status.
No throttling but poor results Host/path/workload Check CPU, network, attachment type, multipath, OS logs, and competing I/O.

15. Ultra High Performance and Multipath Checks

For Ultra High Performance volumes, validate that the attachment is multipath-enabled and the guest operating system supports the required configuration.

Important checks:

  • Confirm the volume is configured for the expected UHP level.
  • Confirm the instance shape supports UHP and the required number of attachments.
  • Confirm multipath is enabled for the attachment.
  • Confirm the Block Volume Management plugin and guest configuration are correct where required.

References:

16. What To Provide When Opening a Support Request

If you determine you need to engage support, include the following information to make performance investigation actionable:

Required Information Example / Notes
Volume OCID Block Volume or Boot Volume OCID
Instance OCID Instance where the test ran
Region and availability domain Include fault domain if relevant
Volume size and VPU setting Include whether UHP is enabled
Instance shape Include OCPU count and OS version
Attachment type iSCSI, paravirtualized, multipath status
Test command Exact fio or DiskSpd command used
Tool version fio --version or DiskSpd version
Test timestamp UTC start/end time
Test output Full command output, including latency percentiles
OCI metrics IOPS, throughput, latency, and VolumeThrottledIOs for the test window
Workload context Whether production workload was active during the test
Expected result Expected IOPS/throughput calculation and source documentation