I generally do development work for OmniOS bloody in a KVM virtual machine with a 300G zvol for the disk and that disk is usually only around 10% full:
bloody% zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROT rpool 298G 34.0G 264G - - 7% 11% 1.00x ONLINE -
Outside of the VM, the zvol is part of a pool which has lz4 compression enabled and so it starts off using virtually no disk space. However, since ZFS uses copy-on-write when changing blocks, over time most of the blocks in the zvol end up being touched and so the zvol size on disk grows towards 300G.
global% zfs list data/omniosce/hdd-bloody NAME USED AVAIL REFER MOUNTPOINT data/omniosce/hdd-bloody 538G 7.08T 275G -
I thought this would be a good setup to test illumos’ new
zpool initialize command. This command writes
a pattern of data to all unallocated regions of a pool (or a specific device
in a pool).
The original intention of this new command is actually to ensure that all
blocks in a ZFS vdev are allocated - effectively stretching a new sparse
volume to avoid performance penalties in the future. For that reason the
default data pattern that is written is
If I left this as the default, I’d probably still get good space recovery since blocks containing just this repeated pattern would compress pretty well, but it’s better to write zeroes and have the block not written to the underlying storage at all.
Changing the default pattern can be done via
mdb on a live system, or
by setting the value in
/etc/system and rebooting; this also has the
benefit of changing the default for this value.
bloody% pfexec mdb -kwe 'zfs_initialize_value/z0' zfs_initialize_value: 0xdeadbeefdeadbeef = 0x0
Now set initialisation running:
bloody% pfexec zpool initialize rpool ... a couple of hours later ... bloody% zpool status pool: rpool state: ONLINE scan: scrub repaired 0 in 1h39m with 0 errors on Sat May 12 15:28:36 2018 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 c2t0d0 ONLINE 0 0 0 (100% initialized, completed at ...) errors: No known data errors
and re-checking the disk space used from outside:
global% zfs list data/omniosce/hdd-bloody NAME USED AVAIL REFER MOUNTPOINT data/omniosce/hdd-bloody 308G 7.30T 30.5G -