mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 11:47:43 +03:00
fat zap should prefetch when iterating
When iterating over a ZAP object, we're almost always certain to iterate over the entire object. If there are multiple leaf blocks, we can realize a performance win by issuing reads for all the leaf blocks in parallel when the iteration begins. For example, if we have 10,000 snapshots, "zfs destroy -nv pool/fs@1%9999" can take 30 minutes when the cache is cold. This change provides a >3x performance improvement, by issuing the reads for all ~64 blocks of each ZAP object in parallel. Reviewed-by: Andreas Dilger <andreas.dilger@whamcloud.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> External-issue: DLPX-58347 Closes #8862
This commit is contained in:
committed by
Brian Behlendorf
parent
d9cd66e45f
commit
d9b4bf0665
@@ -81,6 +81,13 @@ int zfs_dmu_offset_next_sync = 0;
|
||||
*/
|
||||
int zfs_object_remap_one_indirect_delay_ms = 0;
|
||||
|
||||
/*
|
||||
* Limit the amount we can prefetch with one call to this amount. This
|
||||
* helps to limit the amount of memory that can be used by prefetching.
|
||||
* Larger objects should be prefetched a bit at a time.
|
||||
*/
|
||||
int dmu_prefetch_max = 8 * SPA_MAXBLOCKSIZE;
|
||||
|
||||
const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
|
||||
{DMU_BSWAP_UINT8, TRUE, FALSE, FALSE, "unallocated" },
|
||||
{DMU_BSWAP_ZAP, TRUE, TRUE, FALSE, "object directory" },
|
||||
@@ -667,6 +674,11 @@ dmu_prefetch(objset_t *os, uint64_t object, int64_t level, uint64_t offset,
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* See comment before the definition of dmu_prefetch_max.
|
||||
*/
|
||||
len = MIN(len, dmu_prefetch_max);
|
||||
|
||||
/*
|
||||
* XXX - Note, if the dnode for the requested object is not
|
||||
* already cached, we will do a *synchronous* read in the
|
||||
@@ -2629,6 +2641,10 @@ module_param(zfs_dmu_offset_next_sync, int, 0644);
|
||||
MODULE_PARM_DESC(zfs_dmu_offset_next_sync,
|
||||
"Enable forcing txg sync to find holes");
|
||||
|
||||
module_param(dmu_prefetch_max, int, 0644);
|
||||
MODULE_PARM_DESC(dmu_prefetch_max,
|
||||
"Limit one prefetch call to this size");
|
||||
|
||||
/* END CSTYLED */
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user