ZAP: Reduce leaf array and free chunks fragmentationmaster
commit9a81484e35f2ec12055835eccd2284d1ba8dbcab
authorAlexander Motin <mav@FreeBSD.org>
Wed, 20 Nov 2024 21:37:52 +0000 (20 16:37 -0500)
committerGitHub <noreply@github.com>
Wed, 20 Nov 2024 21:37:52 +0000 (20 13:37 -0800)
tree338e6a660dad1f22c1eeb78fa95af2d4949345f0
parentd02257c2804ca7c275cc5c64af9643d32624a61e
ZAP: Reduce leaf array and free chunks fragmentation

Previous implementation of zap_leaf_array_free() put chunks on the
free list in reverse order.  Also zap_leaf_transfer_entry() and
zap_entry_remove() were freeing name and value arrays in reverse
order.  Together this created a mess in the free list, making
following allocations much more fragmented than necessary.

This patch re-implements zap_leaf_array_free() to keep existing
chunks order, and implements non-destructive zap_leaf_array_copy()
to be used in zap_leaf_transfer_entry() to allow properly ordered
freeing name and value arrays there and in zap_entry_remove().

With this change test of some writes and deletes shows percent of
non-contiguous chunks in DDT reducing from 61% and 47% to 0% and
17% for arrays and frees respectively.  Sure some explicit sorting
could do even better, especially for ZAPs with variable-size arrays,
but it would also cost much more, while this should be very cheap.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored by: iXsystems, Inc.
Closes #16766
module/zfs/zap_leaf.c