ProxmoxGuide

ZFS Pool Capacity & Redundancy Calculator

Model real usable Proxmox VE pool capacity — RAIDZ parity, ashift padding overhead, the ZFS slop reserve, and the 80% fill ceiling — not the naive (n-p)*size guess.

Pool design is the one Proxmox VE storage decision you cannot cheaply undo. You cannot remove a RAIDZ vdev or change its width after creation — you would have to destroy and rebuild the pool. Model it here before you buy disks. Every number below is computed in your browser; nothing is sent anywhere.

Your pool

Support devices & tuning (optional)

Capacity & redundancy

Raw (all disks)
—
Usable (ZFS)
—
Safe @ 80%
—
Storage efficiency
—
Usable data Parity + padding ZFS slop reserve 80% headroom (free, not lost)

Methodology & honest caveats

Usable capacity here is an engineering approximation, deliberately more conservative than the textbook (n − p) × disk_size you see in most calculators. That naive formula ignores three real sources of loss this tool models:

  1. RAIDZ parity: each RAIDZp vdev of n disks loses a p/n fraction of raw to parity (the data fraction is (n − p)/n).
  2. ashift padding: ZFS splits every record into data + parity sectors and rounds the total up to a multiple of (p + 1) sectors. On the default 128 KiB record at ashift=12 (32 sectors/record) the loss is small; it grows with wider sectors and parity. We apply a deflation factor from the sectors-per-record table in zfs-constants.json rather than assuming zero padding.
  3. ZFS slop + 80% rule: OpenZFS permanently reserves 1/64 (~1.56%) as slop so the pool can still free space when full, and RAIDZ/CoW fragmentation makes the practical ceiling ~80%. "Safe @ 80%" is what you should actually plan against.

Drive vendors sell in decimal TB; ZFS reports binary TiB. We convert at the documented TiB/TB ratio. We do not fold in pool metadata, spacemaps, ditto blocks or snapshot churn — those are workload-dependent (often another 1–3%) and lumping them in would hide the inspectable parity/padding model. Treat "Usable (ZFS)" as a slightly optimistic upper bound and "Safe @ 80%" as your planning figure. Mixed disk sizes in one RAIDZ vdev are modeled at the smallest disk, exactly as ZFS does.

Constants & sources are in src/data/zfs-constants.json (model v1.2.0). This is decision-support, not a guarantee — always verify with zpool list / zfs list on the built pool.

Sizing ARC: the RAM side of a ZFS pool

Capacity is only half of a ZFS build. The other half is RAM, because ZFS keeps its read cache (the ARC) in host memory, and on a Proxmox VE hypervisor that is the same memory your guests want. A useful first estimate is roughly 1 GB of RAM per 1 TB of used pool storage for the cache to stay effective, on top of what the VMs and PVE services need — a starting point, not a ceiling.

The mistake that hurts is leaving ARC uncapped. Left alone, OpenZFS grows ARC toward half of system memory (more on newer releases), and it does not hand that memory back fast enough for a guest that allocates its heap in one go, which shows up as stalls or an out-of-memory kill of a QEMU process. Since Proxmox VE 8.1, new ZFS installs ship a conservative zfs_arc_max (10% of RAM, capped at 16 GiB); in-place upgrades keep the old behaviour, so check and set it explicitly.

Budget ARC against your real guest memory, then model the pool above. The full walk-through — root-on-ZFS layout, volblocksize, RAIDZ versus mirrors, and capping zfs_arc_max — is in the Proxmox ZFS storage guide.

Related tools in this network

Other interactive tools across the network that pair well with this one.