Skip to content

Disk I/O Performance

Blaze is designed for local NVMe SSD storage. RocksDB, the storage engine of Blaze, exploits the fast random access patterns SSDs provide. This page describes how to measure whether the disks of a deployment are fast enough.

Built-In Measurement Feature: ADMIN_API Since 1.11

Blaze contains a disk performance measurement job that benchmarks a database directory volume with an I/O profile similar to the one Blaze's RocksDB databases produce. It can be started either in the Jobs section of the admin UI or via the $disk-perf operation.

The benchmark runs three phases against temporary files in the chosen database directory:

  • seq-write — writes a test file (default 4 GiB) sequentially in 1 MiB chunks, like RocksDB writes SST files during compactions and memtable flushes,
  • rand-read — reads blocks of DB_BLOCK_SIZE (default 16 KiB) at random offsets, like RocksDB reads blocks on point queries. The number of concurrent readers is swept in powers of two from 1 up to max-concurrency (default 32, so 1, 2, 4, 8, 16, 32), with one run of the configured phase duration per level. The resulting distribution of IOPS over the concurrency tells the story of a disk: the run with one reader exposes the pure device (or network) latency, the slope shows how the storage absorbs parallelism and the plateau shows saturation — matching Blaze, which reads at different concurrencies in different scenarios. Direct I/O is used to bypass the page cache where the filesystem supports it, so the numbers reflect the disk instead of the memory,
  • fsync — writes small chunks sequentially, each followed by an fsync, like the write-ahead logs of the transaction and resource stores which are synced on every write.

WARNING

The benchmark competes with regular request processing for disk I/O and writes a test file of the configured size into the database directory. Run it on an otherwise idle server and ensure enough free disk space.

Results

The job outputs the raw numbers of each phase:

OutputDescription
seq-write-throughputsequential write throughput in bytes per second
read-iopsrandom read operations per second, one output per concurrency level
read-throughputrandom read throughput in bytes per second, one output per concurrency level
read-latency-p50 / -p95 / -p99 / -maxrandom read latency percentiles in microseconds, one output per concurrency level
fsync-ratewrite + fsync operations per second
fsync-latency-p50 / -p95 / -p99write + fsync latency percentiles in microseconds
direct-iowhether the random reads could bypass the page cache

Each per-level read output carries the number of concurrent readers of its run in the https://blaze-server.org/fhir/StructureDefinition/disk-perf-concurrency extension. The admin UI plots the IOPS over the concurrency together with the reference curve of a good local NVMe SSD.

Score

In addition to the raw numbers, the job outputs a score between 0 and 100. The random read sub-score compares the IOPS of every run of the concurrency sweep against the reference curve of a good local NVMe SSD — 10,000 IOPS per reader, corresponding to a 100 µs read, capped at 320,000 IOPS at 32 readers — and combines the per-level results as a geometric mean with equal weights, so both the low-concurrency latency regime and the high-concurrency throughput regime count. Sequential writes are normalized against 1 GB/s (10⁹ bytes per second, or 954 MiB/s in the binary units the measured throughputs are given in) and fsyncs against 1,000 per second. The three sub-scores are combined as a weighted geometric mean with random reads weighted at one half and sequential writes and fsyncs at one quarter each, because random reads dominate Blaze's interactive query load. The geometric mean ensures that one collapsed dimension collapses the whole score.

Because every level of the sweep contributes to the score, scores are only comparable between runs with the same max-concurrency.

ScoreRatingInterpretation
≥ 80excellentperforms like a good local NVMe SSD
≥ 50goodwell suited for production use
≥ 25acceptableworks, but larger deployments will be limited by disk I/O
< 25insufficientexpect poor performance; consider local NVMe SSD storage

If direct-io is false, the filesystem doesn't support bypassing the page cache, and the random read numbers are inflated by page cache hits — treat the score as an upper bound in that case.

Example Results

The measurement was run on the following systems, which are also used in the CQL, FHIR Search and Load Testing performance evaluations:

SystemProviderCPUCoresRAMSSD
A5N46on-premRyzen 9900X2496 GiB4 TB Samsung 990 Pro
LEA47on-premEPYC 7543P16128 GiB3.2 TB Intel P5600 over vSAN
LEA79on-premEPYC 9555128768 GiB12.8 TB Huawei OceanDisk 300P

All systems were configured according to the Production Configuration guide. Every measurement ran on an otherwise idle server with the default parameters: a 4 GiB test file, 30 s per phase and a maximum concurrency of 32.

A5N46

Score
64.9/ 100 · good
Best Random Read IOPS
386 k@ 32 readers
Sequential Write Throughput
3.1 GiB/s
Fsyncs per Second
178· P50 5.4 ms
Line chart. Random Read IOPS (A5N46). Concurrent Readers from 1 to 32. IOPS: Measured, Reference.Random Read IOPS (A5N46)0 k50 k100 k150 k200 k250 k300 k350 k400 k12481632Concurrent Readers 1 · Measured: 18.8 k IOPSConcurrent Readers 2 · Measured: 41.7 k IOPSConcurrent Readers 4 · Measured: 82.2 k IOPSConcurrent Readers 8 · Measured: 154 k IOPSConcurrent Readers 16 · Measured: 265 k IOPSConcurrent Readers 32 · Measured: 386 k IOPSConcurrent Readers 1 · Reference: 10.0 k IOPSConcurrent Readers 2 · Reference: 20.0 k IOPSConcurrent Readers 4 · Reference: 40.0 k IOPSConcurrent Readers 8 · Reference: 80.0 k IOPSConcurrent Readers 16 · Reference: 160 k IOPSConcurrent Readers 32 · Reference: 320 k IOPSIOPSConcurrent ReadersMeasuredReference
Line chart. Random Read Latency (A5N46). Concurrent Readers from 1 to 32. Latency (µs): P50, P95, P99.Random Read Latency (A5N46)05010015020025012481632Concurrent Readers 1 · P50: 55.1 µsConcurrent Readers 2 · P50: 46.3 µsConcurrent Readers 4 · P50: 46.3 µsConcurrent Readers 8 · P50: 46.3 µsConcurrent Readers 16 · P50: 55.1 µsConcurrent Readers 32 · P50: 71.5 µsConcurrent Readers 1 · P95: 55.1 µsConcurrent Readers 2 · P95: 55.1 µsConcurrent Readers 4 · P95: 60.1 µsConcurrent Readers 8 · P95: 71.5 µsConcurrent Readers 16 · P95: 92.7 µsConcurrent Readers 32 · P95: 156 µsConcurrent Readers 1 · P99: 55.1 µsConcurrent Readers 2 · P99: 65.5 µsConcurrent Readers 4 · P99: 71.5 µsConcurrent Readers 8 · P99: 85.0 µsConcurrent Readers 16 · P99: 120 µsConcurrent Readers 32 · P99: 202 µsLatency (µs)Concurrent ReadersP50P95P99

A5N46 has the fastest random reads of the three: a single reader reaches 18.8 k IOPS at a median latency of 55 µs, and the sweep scales almost linearly to 386 k IOPS at 32 readers, staying above the reference curve at every level. That last part is by construction: the reference curve is modelled on this very drive, set deliberately below its measured numbers so that other good local NVMe SSDs clear it as well. Its fsync rate of 178/s at a median fsync latency of 5.4 ms is by far the weakest of the three, though — the drive acknowledges a sync only once the data has reached the flash instead of from a write cache. Because every transaction has to sync its write-ahead log entries, that is what limits the transaction load test on this system to between 90 and 160 transactions/s despite the fast reads.

LEA47

Score
33.5/ 100 · acceptable
Best Random Read IOPS
66.9 k@ 32 readers
Sequential Write Throughput
460 MiB/s
Fsyncs per Second
484· P50 1.9 ms
Line chart. Random Read IOPS (LEA47). Concurrent Readers from 1 to 32. IOPS: Measured, Reference.Random Read IOPS (LEA47)0 k50 k100 k150 k200 k250 k300 k350 k12481632Concurrent Readers 1 · Measured: 2.2 k IOPSConcurrent Readers 2 · Measured: 4.9 k IOPSConcurrent Readers 4 · Measured: 9.7 k IOPSConcurrent Readers 8 · Measured: 19.3 k IOPSConcurrent Readers 16 · Measured: 37.7 k IOPSConcurrent Readers 32 · Measured: 66.9 k IOPSConcurrent Readers 1 · Reference: 10.0 k IOPSConcurrent Readers 2 · Reference: 20.0 k IOPSConcurrent Readers 4 · Reference: 40.0 k IOPSConcurrent Readers 8 · Reference: 80.0 k IOPSConcurrent Readers 16 · Reference: 160 k IOPSConcurrent Readers 32 · Reference: 320 k IOPSIOPSConcurrent ReadersMeasuredReference
Line chart. Random Read Latency (LEA47). Concurrent Readers from 1 to 32. Latency (µs): P50, P95, P99.Random Read Latency (LEA47)010020030040050060070080012481632Concurrent Readers 1 · P50: 441 µsConcurrent Readers 2 · P50: 404 µsConcurrent Readers 4 · P50: 404 µsConcurrent Readers 8 · P50: 404 µsConcurrent Readers 16 · P50: 441 µsConcurrent Readers 32 · P50: 481 µsConcurrent Readers 1 · P95: 572 µsConcurrent Readers 2 · P95: 524 µsConcurrent Readers 4 · P95: 524 µsConcurrent Readers 8 · P95: 572 µsConcurrent Readers 16 · P95: 572 µsConcurrent Readers 32 · P95: 624 µsConcurrent Readers 1 · P99: 680 µsConcurrent Readers 2 · P99: 624 µsConcurrent Readers 4 · P99: 624 µsConcurrent Readers 8 · P99: 624 µsConcurrent Readers 16 · P99: 624 µsConcurrent Readers 32 · P99: 742 µsLatency (µs)Concurrent ReadersP50P95P99

The Intel P5600 itself is a fast NVMe SSD, but LEA47 accesses it over vSAN, which adds network latency to every I/O operation: a single reader reaches only 2.2 k IOPS at a median latency of 441 µs, less than a quarter of the reference. The IOPS still scale linearly with the concurrency while the latency stays flat over the whole sweep, so it is the round-trip, not the drive, that the reads wait for. Together with 460 MiB/s of sequential write throughput and 484 fsyncs/s at a median latency of 1.9 ms, that ends at an acceptable score of 33.5 — the system works, but larger deployments will be limited by disk I/O.

LEA79

Score
100.0/ 100 · excellent
Best Random Read IOPS
440 k@ 32 readers
Sequential Write Throughput
10.7 GiB/s
Fsyncs per Second
122 k· P50 8.2 µs
Line chart. Random Read IOPS (LEA79). Concurrent Readers from 1 to 32. IOPS: Measured, Reference.Random Read IOPS (LEA79)0 k100 k200 k300 k400 k500 k12481632Concurrent Readers 1 · Measured: 14.6 k IOPSConcurrent Readers 2 · Measured: 28.8 k IOPSConcurrent Readers 4 · Measured: 57.3 k IOPSConcurrent Readers 8 · Measured: 114 k IOPSConcurrent Readers 16 · Measured: 225 k IOPSConcurrent Readers 32 · Measured: 440 k IOPSConcurrent Readers 1 · Reference: 10.0 k IOPSConcurrent Readers 2 · Reference: 20.0 k IOPSConcurrent Readers 4 · Reference: 40.0 k IOPSConcurrent Readers 8 · Reference: 80.0 k IOPSConcurrent Readers 16 · Reference: 160 k IOPSConcurrent Readers 32 · Reference: 320 k IOPSIOPSConcurrent ReadersMeasuredReference
Line chart. Random Read Latency (LEA79). Concurrent Readers from 1 to 32. Latency (µs): P50, P95, P99.Random Read Latency (LEA79)02040608010012012481632Concurrent Readers 1 · P50: 65.5 µsConcurrent Readers 2 · P50: 65.5 µsConcurrent Readers 4 · P50: 65.5 µsConcurrent Readers 8 · P50: 65.5 µsConcurrent Readers 16 · P50: 71.5 µsConcurrent Readers 32 · P50: 71.5 µsConcurrent Readers 1 · P95: 77.9 µsConcurrent Readers 2 · P95: 77.9 µsConcurrent Readers 4 · P95: 77.9 µsConcurrent Readers 8 · P95: 77.9 µsConcurrent Readers 16 · P95: 77.9 µsConcurrent Readers 32 · P95: 85.0 µsConcurrent Readers 1 · P99: 77.9 µsConcurrent Readers 2 · P99: 77.9 µsConcurrent Readers 4 · P99: 77.9 µsConcurrent Readers 8 · P99: 85.0 µsConcurrent Readers 16 · P99: 92.7 µsConcurrent Readers 32 · P99: 110 µsLatency (µs)Concurrent ReadersP50P95P99

LEA79 reaches the maximum score with all three dimensions above the reference values. The random reads scale linearly to 440 k IOPS at 32 readers, above the reference of 320 k, at a median latency that stays between 65 µs and 72 µs over the whole sweep. Sequential writes reach 10.7 GiB/s, and the fsync rate of 122 k/s at a median latency of 8.2 µs indicates a write cache that can acknowledge syncs almost immediately, which is why the same transaction load test sustains over 5000 transactions/s here.

All three systems support direct I/O, so the random read numbers reflect the disks themselves.