Technical

Proxmox ZFS storage summary: map Size, Used, and Avail to zpool list and zfs list

Proxmox ZFS storage summary: map Size, Used, and Avail to zpool list and zfs list

The Proxmox ZFS storage summary pulls Size, Used, and Avail straight from zpool list, but the per-dataset rows come from zfs list. That’s why the numbers look contradictory.

Close-up of an open vintage hard disk drive showcasing its internal components.

Where each field comes from

Open the storage summary in the GUI. The top section shows the pool’s total capacity, used space, and available space. Those three numbers are exactly what zpool list reports for the pool. Run it on the node:

zpool list

Compare the output. The SIZE, ALLOC, and FREE columns match the GUI’s Size, Used, and Avail. No mystery there.

Below that, the GUI lists datasets with their own Used and Referenced columns. Those come from zfs list, not zpool list. Run:

zfs list

The USED column for each dataset is what the GUI shows as Used. But here’s the catch: the pool’s Used in zpool list includes space used by snapshots, reservations, and metadata that zfs list doesn’t attribute to any single dataset. So the sum of dataset Used values will be less than the pool’s Used. That’s normal.

Why Avail doesn’t match free space in zfs list

The GUI’s Avail is the pool’s FREE from zpool list. But each dataset in zfs list has its own AVAIL column. That per-dataset AVAIL is the space available to that dataset, which can be limited by quotas or reservations. If you set a quota on a dataset, its AVAIL drops, but the pool’s FREE stays the same. The GUI shows the pool-level Avail, not the dataset’s.

Close-up of a vintage Seagate hard disk drive illustrating retro computer hardware.

Snapshots and reservations mess with Used

Snapshots are the usual culprit when Used seems too high. A snapshot holds a reference to blocks that have since been deleted from the live dataset. Those blocks count against the pool’s Used but not against the dataset’s Used in zfs list unless you use zfs list -o space to see the USEDSNAP column. The GUI doesn’t show that breakdown, so you have to go to the CLI.

Reservations also skew things. If you reserve 20G for a dataset, that space is counted as used by the pool even if the dataset is empty. The GUI’s Used for the pool will include it, but the dataset’s Used won’t.

My take

Don’t try to reconcile the numbers in your head. Just remember: pool-level numbers are zpool list, dataset numbers are zfs list. If you need the real breakdown of what’s eating space, run zfs list -o space and look at USEDSNAP, USEDDS, and USEDREFRESERV. That’s the only way to see where the space actually went.

Related: Lower ZFS ARC Max Size Proxmox if you’re also fighting memory pressure.

Leave a comment

Comments are reviewed before they appear. Your email is never published.