Skip to download

hesela.dev

Storage glossary · datasets · llms.txt · hesela.com

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 columns

JSON 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.

Disk 0 fails. Every survivor initially holds 35 fragments. All reads count whole 64 MiB helper fragments.
LayoutSurvivor diskFragments readMiB read
fixed-4-of-81352240
fixed-4-of-82352240
fixed-4-of-83352240
fixed-4-of-8400
fixed-4-of-8500
fixed-4-of-8600
fixed-4-of-8700
balanced-4-of-8115960
balanced-4-of-8215960
balanced-4-of-8315960
balanced-4-of-8415960
balanced-4-of-8515960
balanced-4-of-8615960
balanced-4-of-8715960
wide-8-of-81352240
wide-8-of-82352240
wide-8-of-83352240
wide-8-of-84352240
wide-8-of-85352240
wide-8-of-86352240
wide-8-of-87352240

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

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.

  1. 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)
  2. 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)
  3. 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.