Two storage layouts on the same all-NVMe StorWize V7000 Gen3, driven by an IBM
Power9 9009-22A over 16Gb fibre channel: traditional RAID 10 and Distributed
RAID 6. Below is the full XDISK run across block sizes, thread counts, and the
usual read/write profiles.
The hardware
IBM Power9 9009-22A
- 512GB DDR4 memory
- 2x 8-core Power9 processor
- 2x 400GB NVMe M.2 SSD for
rootvg
- 16Gb FC 2-port adapter pair
- FW910.20 (VL910_122) firmware
- AIX 7.2 ML3
AIX_AAPCM MPIO driver
algorithm set to shortest_queue
reserve_policy set to no_reserve
queue_depth set to 32
IBM StorWize V7000 Gen3
- 17x 1.92TB 2.5” NVMe flash drive
- 16Gb FC 4-port adapter pair
- 120GB M.2 boot drive pair
- Spectrum Virtualize 8.2.1.1
Test methodology
The tests were run with XDISK V8.6 for AIX 7.2 using the -ORW flags specific
to AIX, to benchmark the storage array directly and bypass the VMM cache. Each
layout was put through the same matrix:
- Random and sequential I/O at 8K, 16K, and 1MB block sizes
- 1 thread and 16 threads
- 100% read, 100% write, 50/50 read/write (backup profile), and 80/20 read/write (OLTP database profile)
In the tables below, Read (ms) and Write (ms) are the average latencies
reported for that profile; a — means that side of the workload doesn’t apply
(e.g. no writes in a 100% read run).
Traditional RAID 10
Two mdisk devices, 16 drives total plus 1 spare.
8K block size — 1 thread
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 236,587 | 1,848 | 0.003 | — |
| Random | 100% write | 4,015 | 31.4 | — | 0.247 |
| Random | 50/50 | 7,832 | 61.2 | 0.004 | 0.248 |
| Random | 80/20 | 18,509 | 144.6 | 0.003 | 0.248 |
| Sequential | 100% read | 345,942 | 2,703 | 0.002 | — |
| Sequential | 100% write | 3,123 | 24.4 | — | 0.319 |
| Sequential | 50/50 | 6,710 | 52.4 | 0.003 | 0.293 |
| Sequential | 80/20 | 17,871 | 139.6 | 0.003 | 0.265 |
8K block size — 16 threads
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 1,505,683 | 11,763 | 0.003 | — |
| Random | 100% write | 33,141 | 258.9 | — | 0.480 |
| Random | 50/50 | 62,571 | 488.8 | 0.022 | 0.485 |
| Random | 80/20 | 151,339 | 1,182 | 0.010 | 0.479 |
| Sequential | 100% read | 3,581,072 | 27,977 | 0.004 | — |
| Sequential | 100% write | 28,645 | 223.8 | — | 0.557 |
| Sequential | 50/50 | 58,762 | 459.1 | 0.027 | 0.515 |
| Sequential | 80/20 | 148,521 | 1,160 | 0.010 | 0.495 |
16K block size — 1 thread
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 178,765 | 2,793 | 0.004 | — |
| Random | 100% write | 3,966 | 31.0 | — | 0.250 |
| Random | 50/50 | 7,289 | 113.9 | 0.004 | 0.265 |
| Random | 80/20 | 17,327 | 270.7 | 0.004 | 0.263 |
| Sequential | 100% read | 238,870 | 3,732 | 0.003 | — |
| Sequential | 100% write | 3,366 | 52.6 | — | 0.295 |
| Sequential | 50/50 | 7,028 | 109.8 | 0.005 | 0.277 |
| Sequential | 80/20 | 17,454 | 272.7 | 0.004 | 0.265 |
1MB block size — 1 thread
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 5,847 | 5,847 | 0.169 | — |
| Random | 100% write | 4,161 | 32.5 | — | 0.238 |
| Random | 50/50 | 756 | 756.0 | 0.173 | 2.40 |
| Random | 80/20 | 1,589 | 1,589 | 0.172 | 2.38 |
| Sequential | 100% read | 5,215 | 5,215 | 0.191 | — |
| Sequential | 100% write | 410 | 410.0 | — | 2.36 |
| Sequential | 50/50 | 767 | 767.0 | 0.173 | 2.36 |
| Sequential | 80/20 | 1,409 | 1,409 | 0.200 | 2.67 |
1MB block size — 16 threads
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 78,682 | 78,682 | 0.201 | — |
| Random | 100% write | 33,581 | 262.4 | — | 0.474 |
| Random | 50/50 | 2,325 | 2,325 | 0.616 | 13.0 |
| Random | 80/20 | 6,610 | 6,610 | 0.346 | 10.6 |
| Sequential | 100% read | 76,001 | 76,001 | 0.210 | — |
| Sequential | 100% write | 1,351 | 1,351 | — | 11.7 |
| Sequential | 50/50 | 2,659 | 2,659 | 0.612 | 11.3 |
| Sequential | 80/20 | 6,602 | 6,602 | 0.349 | 10.6 |
Distributed RAID 6 (DRAID6)
One mdisk device, 16 drives, 2 rebuild areas, 1 spare.
Pool0
- State: Online
- Capacity: 15.49 TiB / 20.23 TiB (77%)
- Volumes: 1 · MDisks: 1
- Encryption: Not encrypted
- Data reduction: Enabled
- Easy Tier: Balanced
- Extent size: 1.00 GiB
- Free physical capacity: 4.75 TiB
mdisk0
- State: Online
- Capacity: 20.26 TiB
- Pool: Pool0 · Mode: Array · Tier: Tier 0 Flash
- Write protected: No
- Encryption: Not encrypted · Deduplication: Not active
- Fast-Write state: Empty
- Thin-provisioned: No · Supports unmap: Yes
- RAID level: Distributed RAID 6 · Redundancy: 2
- Rebuild areas goal: 2 · Rebuild areas total: 2
- Strip size: 256 KiB
8K block size — 1 thread
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 228,787 | 1,787 | 0.003 | — |
| Random | 100% write | 4,061 | 31.7 | — | 0.244 |
| Random | 50/50 | 7,766 | 60.7 | 0.004 | 0.250 |
| Random | 80/20 | 18,293 | 142.9 | 0.003 | 0.252 |
| Sequential | 100% read | 354,277 | 2,768 | 0.002 | — |
| Sequential | 100% write | 3,065 | 23.9 | — | 0.325 |
| Sequential | 50/50 | 6,629 | 51.8 | 0.003 | 0.297 |
| Sequential | 80/20 | 16,971 | 132.6 | 0.003 | 0.278 |
8K block size — 16 threads
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 1,501,107 | 11,727 | 0.003 | — |
| Random | 100% write | 27,052 | 211.3 | — | 0.589 |
| Random | 50/50 | 46,707 | 364.9 | 0.027 | 0.653 |
| Random | 80/20 | 115,231 | 900.2 | 0.012 | 0.635 |
| Sequential | 100% read | 3,475,273 | 27,151 | 0.004 | — |
| Sequential | 100% write | 25,121 | 196.3 | — | 0.635 |
| Sequential | 50/50 | 52,680 | 411.6 | 0.027 | 0.578 |
| Sequential | 80/20 | 123,603 | 965.6 | 0.011 | 0.597 |
16K block size — 1 thread
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 181,688 | 2,839 | 0.004 | — |
| Random | 100% write | 3,934 | 30.7 | — | 0.252 |
| Random | 50/50 | 7,076 | 110.6 | 0.004 | 0.274 |
| Random | 80/20 | 16,432 | 256.8 | 0.005 | 0.275 |
| Sequential | 100% read | 224,488 | 3,508 | 0.004 | — |
| Sequential | 100% write | 3,184 | 49.8 | — | 0.312 |
| Sequential | 50/50 | 6,931 | 108.3 | 0.005 | 0.281 |
| Sequential | 80/20 | 16,945 | 264.8 | 0.004 | 0.274 |
1MB block size — 1 thread
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 5,741 | 5,741 | 0.172 | — |
| Random | 100% write | 3,989 | 31.2 | — | 0.248 |
| Random | 50/50 | 722 | 722.0 | 0.175 | 2.52 |
| Random | 80/20 | 1,532 | 1,532 | 0.172 | 2.49 |
| Sequential | 100% read | 5,768 | 5,768 | 0.173 | — |
| Sequential | 100% write | 379 | 379.0 | — | 2.57 |
| Sequential | 50/50 | 741 | 741.0 | 0.190 | 2.44 |
| Sequential | 80/20 | 1,555 | 1,555 | 0.172 | 2.45 |
1MB block size — 16 threads
| Pattern | Profile | IO/s | MB/s | Read (ms) | Write (ms) |
|---|
| Random | 100% read | 80,170 | 80,170 | 0.197 | — |
| Random | 100% write | 27,300 | 213.3 | — | 0.583 |
| Random | 50/50 | 1,622 | 1,622 | 0.779 | 18.8 |
| Random | 80/20 | 5,137 | 5,137 | 0.372 | 14.0 |
| Sequential | 100% read | 76,222 | 76,222 | 0.209 | — |
| Sequential | 100% write | 1,173 | 1,173 | — | 13.5 |
| Sequential | 50/50 | 2,168 | 2,168 | 0.671 | 14.0 |
| Sequential | 80/20 | 5,192 | 5,192 | 0.396 | 13.7 |
Takeaways
- As the block size and thread count go up, so does performance — up to a point.
- DRAID6 looks like a strong alternative to traditional RAID 10, even for critical workloads. Anyone moving from spinning-disk RAID 10 arrays to NVMe SSD arrays should seriously weigh the DRAID6 option.
- Failover testing of the active/active storage nodes worked as expected with redundant pathing.
- It was not possible to assign a stand-by hot spare in a DRAID6 configuration.
- Technical documentation for FC-NVMe configuration (instead of FC/SCSI) on Gen3 and/or AIX was unavailable at the time of writing.