Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize microzaps. #14039

Merged
merged 1 commit into from
Oct 20, 2022
Merged

Optimize microzaps. #14039

merged 1 commit into from
Oct 20, 2022

Commits on Oct 18, 2022

  1. Optimize microzaps.

    Microzap on-disk format does not include a hash tree, expecting one to
    be built in RAM during mzap_open().  The built tree is linked to DMU
    user buffer, freed when original DMU buffer is dropped from cache. I've
    found that workloads accessing many large directories and having active
    eviction from DMU cache spend significant amount of time building and
    then destroying the trees.  I've also found that for each 64 byte mzap
    element additional 64 byte tree element is allocated, that is a waste
    of memory and CPU caches.
    
    Improve memory efficiency of the hash tree by switching from AVL-tree
    to B-tree.  It allows to save 24 bytes per element just on pointers.
    Save 32 bits on mze_hash by storing only upper 32 bits since lower 32
    bits are always zero for microzaps.  Save 16 bits on mze_chunkid, since
    microzap can never have so many elements.  Respectively with the 16 bits
    there can be no more than 16 bits of collision differentiators.  As
    result, struct mzap_ent now drops from 48 (rounded to 64) to 8 bytes.
    
    Tune B-trees for small data.  Reduce BTREE_CORE_ELEMS from 128 to 126
    to allow struct zfs_btree_core in case of 8 byte elements to pack into
    2KB instead of 4KB.  Aside of the microzaps it should also help 32bit
    range trees.  Allow custom B-tree leaf size to reduce memmove() time.
    
    Split zap_name_alloc() into zap_name_alloc() and zap_name_init_str().
    It allows to not waste time allocating/freeing memory when processing
    multiple names in a loop during mzap_open().
    
    Together on a pool with 10K directories of 1800 files each and DMU
    cache limited to 128MB this reduces time of `find . -name zzz` by 41%
    from 7.63s to 4.47s, and saves additional ~30% of CPU time on the DMU
    cache reclamation.
    
    Signed-off-by:	Alexander Motin <[email protected]>
    Sponsored by:	iXsystems, Inc.
    amotin committed Oct 18, 2022
    Configuration menu
    Copy the full SHA
    5770353 View commit details
    Browse the repository at this point in the history