Deterministic accounting / no device measurements
Parity declustering: survivor-read accounting
Twenty-one exact survivor rows compare fixed and balanced width-four groups with a width-eight control. Synthetic accounting, not storage measurements.
Download CSV21 survivor rows / 10 columnsJSON and provenance / Model code / Metadata generator / Research explanation
Method
Enumerate all 70 four-disk subsets of eight disks for the balanced layout. Repeat each of two disjoint four-disk groups 35 times for the fixed control; repeat the eight-disk group 35 times for the wide control. Each disk holds 35 equal 64 MiB fragments. For each stripe containing failed disk 0, count one read from each intact member. A stripe has exactly one parity fragment; its position is irrelevant to this single-erasure read count.
Every case loses 2,240 MiB and reconstructs 35 fragments. Fixed width-four and balanced width-four layouts each read 6,720 MiB; the width-eight control reads 15,680 MiB and stores a larger payload in the same raw space. None of these numbers is IOPS or elapsed time.
| Layout | Survivor disk | Fragments read | MiB read |
|---|---|---|---|
| fixed-4-of-8 | 1 | 35 | 2240 |
| fixed-4-of-8 | 2 | 35 | 2240 |
| fixed-4-of-8 | 3 | 35 | 2240 |
| fixed-4-of-8 | 4 | 0 | 0 |
| fixed-4-of-8 | 5 | 0 | 0 |
| fixed-4-of-8 | 6 | 0 | 0 |
| fixed-4-of-8 | 7 | 0 | 0 |
| balanced-4-of-8 | 1 | 15 | 960 |
| balanced-4-of-8 | 2 | 15 | 960 |
| balanced-4-of-8 | 3 | 15 | 960 |
| balanced-4-of-8 | 4 | 15 | 960 |
| balanced-4-of-8 | 5 | 15 | 960 |
| balanced-4-of-8 | 6 | 15 | 960 |
| balanced-4-of-8 | 7 | 15 | 960 |
| wide-8-of-8 | 1 | 35 | 2240 |
| wide-8-of-8 | 2 | 35 | 2240 |
| wide-8-of-8 | 3 | 35 | 2240 |
| wide-8-of-8 | 4 | 35 | 2240 |
| wide-8-of-8 | 5 | 35 | 2240 |
| wide-8-of-8 | 6 | 35 | 2240 |
| wide-8-of-8 | 7 | 35 | 2240 |
Reproduce
The module requires Node.js and no packages, random seed or device access. Run this command beside the downloaded model for byte-identical CSV. The generator additionally writes metadata and SHA-256 hashes; its timestamp is generation time, not an observation period.
node --input-type=module -e 'import { toCsv } from "./parity-declustering.mjs"; process.stdout.write(toCsv())'For the balanced case, 35 lost fragments each need three helpers: 105 reads. Each of seven survivors supplies 15. For the fixed case three survivors supply 35 each, while four supply zero. The export includes those zeroes.
Limits
- This is exhaustive deterministic enumeration, not a random sample, benchmark or field dataset; there is no observation period or statistical confidence interval.
- Eight modeled disks, one known erasure, intact helpers and equal-size fragments; no read failures, duplicate reads, compression, caches or metadata traffic.
- Output writes total 35 fragments in each case but their destination and timing are not modeled.
- The wide control changes parity overhead and payload capacity as well as stripe width. Fixed and balanced width-four cases are the matched comparison.
- Stripe membership is not a full physical layout: no parity rotation, addresses, encoder, queue model or OpenZFS permutation map.
- The model bounds pool size to 16 to prevent uncontrolled combinatorial enumeration. Complete layouts are educational examples, not a production recommendation.
Column definitions
- layout
- Synthetic stripe-membership layout ID.
- poolDisks
- Number of disks in the modeled pool, including the failed disk.
- groupWidth
- Fragments per single-parity stripe, including one parity fragment.
- failedDisk
- Zero-based disk ID lost in this scenario; always 0 in this export.
- survivorDisk
- Zero-based surviving disk ID; includes disks doing zero reads.
- lostBlocks
- Fragments lost on the failed disk; each is independently reconstructed.
- survivorHeldBlocks
- Fragments held on this survivor before failure, including parity.
- readBlocks
- Whole helper fragments read from this survivor for complete modeled repair.
- fragmentBytes
- Bytes per fragment; 67108864 bytes = 64 MiB.
- readBytes
- readBlocks multiplied by fragmentBytes; excludes reconstructed writes.
Sources and license
CC0-1.0 for Hesela's original model and generated data; cited sources retain their own rights.
- Mark Holland and Garth A. Gibson. Parity Declustering for Continuous Operation in Redundant Disk Arrays. ASPLOS 1992, pp. 23-35; sections 2, 4-8. (accessed 2026-10-13)
- Brent Welch, Marc Unangst, Zainul Abbasi, Garth Gibson, Brian Mueller, Jason Small, Jim Zelenka and Bin Zhou. Scalable Performance of the Panasas Parallel File System. FAST 2008; section 4.2 and Appendix A, experiment 3. (accessed 2026-10-13)
- OpenZFS: dRAID how-to, Introduction and Rebuilding to a Distributed Spare (living documentation, functionality introduced in 2.1.0). (accessed 2026-10-13)
Definitions: parity declustering and distributed spare. Compare the separate LRC repair-cost model, which changes coding topology rather than placement alone.