mirror_zfs/include/sys
Matthew Ahrens be5c6d9653
Only examine best metaslabs on each vdev
On a system with very high fragmentation, we may need to do lots of gang
allocations (e.g. most indirect block allocations (~50KB) may need to
gang). Before failing a "normal" allocation and resorting to ganging, we
try every metaslab.  This has the impact of loading every metaslab (not
a huge deal since we now typically keep all metaslabs loaded), and also
iterating over every metaslab for every failing allocation. If there are
many metaslabs (more than the typical ~200, e.g. due to vdev expansion
or very large vdevs), the CPU cost of this iteration can be very
impactful.  This iteration is done with the mg_lock held, creating long
hold times and high lock contention for concurrent allocations,
ultimately causing long txg sync times and poor application performance.

To address this, this commit changes the behavior of "normal" (not
try_hard, not ZIL) allocations.  These will now only examine the 100
best metaslabs (as determined by their ms_weight).  If none of these
have a large enough free segment, then the allocation will fail and
we'll fall back on ganging.

To accomplish this, we will now (normally) gang before doing a
`try_hard` allocation.  Non-try_hard allocations will only examine the
100 best metaslabs of each vdev.  In summary, we will first try normal
allocation.  If that fails then we will do a gang allocation.  If that
fails then we will do a "try hard" gang allocation.  If that fails then
we will have a multi-layer gang block.

Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #11327
2020-12-16 14:40:05 -08:00
..
crypto Avoid installing kernel headers on FreeBSD 2020-06-27 17:40:14 -07:00
fm Avoid posting duplicate zpool events 2020-09-04 10:34:28 -07:00
fs Assertion failure when logging large output of channel program 2020-11-14 10:17:16 -08:00
lua FreeBSD: Reduce stack usage of Lua 2020-09-22 16:03:11 -07:00
sysevent Avoid installing kernel headers on FreeBSD 2020-06-27 17:40:14 -07:00
zstd zstd: track allocator statistics 2020-10-30 15:26:10 -07:00
abd_impl.h Removing ZERO_PAGE abd_alloc_zero_scatter 2020-06-10 17:54:11 -07:00
abd.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
aggsum.h Reduce number of atomic_add() calls in aggsum 2020-02-06 13:21:06 -08:00
arc_impl.h dmu_zfetch: fix memory leak 2020-12-12 16:00:00 -08:00
arc.h Implement memory and CPU hotplug 2020-12-10 14:09:23 -08:00
avl_impl.h
avl.h Restore avl_update() calls and related functions 2020-06-03 09:49:32 -07:00
bitops.h
blkptr.h
bplist.h
bpobj.h
bptree.h
bqueue.h
btree.h Fix typos 2020-06-09 21:24:09 -07:00
dataset_kstats.h
dbuf.h Improve zfs receive performance with lightweight write 2020-12-11 10:26:02 -08:00
ddt.h Appease GCC sprintf warnings found on Fedora 32/GCC 10.0.1 2020-08-24 10:32:59 -07:00
dmu_impl.h Remove UIO_ZEROCOPY functions structures 2020-10-30 10:00:33 -07:00
dmu_objset.h Improve zfs receive performance with lightweight write 2020-12-11 10:26:02 -08:00
dmu_recv.h filesystem_limit/snapshot_limit is incorrectly enforced against root 2020-07-11 17:18:02 -07:00
dmu_redact.h
dmu_send.h Add 'zfs send --saved' flag 2020-01-10 10:16:58 -08:00
dmu_traverse.h
dmu_tx.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
dmu_zfetch.h zfetch: Don't issue new streams when old have not completed 2020-09-27 17:08:38 -07:00
dmu.h Remove UIO_ZEROCOPY functions structures 2020-10-30 10:00:33 -07:00
dnode.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
dsl_bookmark.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
dsl_crypt.h dmu_objset_from_ds must be called with dp_config_rwlock held 2020-03-12 10:55:02 -07:00
dsl_dataset.h Add zstd support to zfs 2020-08-20 10:30:06 -07:00
dsl_deadlist.h
dsl_deleg.h
dsl_destroy.h
dsl_dir.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
dsl_pool.h Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
dsl_prop.h Support inheriting properties in channel programs 2020-01-22 17:03:17 -08:00
dsl_scan.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
dsl_synctask.h nowait synctask must succeed 2020-09-04 10:29:39 -07:00
dsl_userhold.h
edonr.h
efi_partition.h
frame.h Linux 5.10 compat: frame.h renamed objtool.h 2020-11-02 22:01:10 +00:00
hkdf.h
Makefile.am Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
metaslab_impl.h Make metaslab class rotor and aliquot per-allocator. 2020-12-15 10:55:44 -08:00
metaslab.h Only examine best metaslabs on each vdev 2020-12-16 14:40:05 -08:00
mmp.h Add zfs_multihost_interval tunable handler for FreeBSD 2020-06-23 13:32:42 -07:00
mntent.h
mod.h Replace ZFS on Linux references with OpenZFS 2020-10-08 20:10:13 -07:00
multilist.h
note.h
nvpair_impl.h
nvpair.h FreeBSD: make adjustments for the standalone environment 2020-10-13 21:05:49 -07:00
objlist.h
pathname.h Replace ZFS on Linux references with OpenZFS 2020-10-08 20:10:13 -07:00
qat.h
range_tree.h Improve compatibility with C++ consumers 2020-06-06 12:54:04 -07:00
rrwlock.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
sa_impl.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
sa.h
skein.h
spa_boot.h
spa_checkpoint.h
spa_checksum.h
spa_impl.h spa: avoid type narrowing warning 2020-12-15 09:20:06 -08:00
spa_log_spacemap.h
spa.h Throw const on some strings 2020-10-02 17:44:10 -07:00
space_map.h Extend zdb to print inconsistencies in livelists and metaslabs 2020-07-14 17:51:05 -07:00
space_reftree.h
sysevent.h
txg_impl.h
txg.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
u8_textprep_data.h
u8_textprep.h Throw const on some strings 2020-10-02 17:44:10 -07:00
uberblock_impl.h
uberblock.h
uio_impl.h
unique.h
uuid.h
vdev_disk.h Make struct vdev_disk_t be platform private 2020-06-16 11:43:33 -07:00
vdev_draid.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
vdev_file.h
vdev_impl.h Reduce latency effects of non-interactive I/O 2020-11-24 09:26:42 -08:00
vdev_indirect_births.h
vdev_indirect_mapping.h
vdev_initialize.h
vdev_raidz_impl.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
vdev_raidz.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
vdev_rebuild.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
vdev_removal.h
vdev_trim.h Trim L2ARC 2020-06-09 10:15:08 -07:00
vdev.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
xvattr.h
zap_impl.h
zap_leaf.h
zap.h
zcp_global.h
zcp_iter.h
zcp_prop.h
zcp_set.h Support setting user properties in a channel program 2020-02-14 13:41:42 -08:00
zcp.h filesystem_limit/snapshot_limit is incorrectly enforced against root 2020-07-11 17:18:02 -07:00
zfeature.h
zfs_acl.h
zfs_bootenv.h zfs label bootenv should store data as nvlist 2020-09-15 15:42:27 -07:00
zfs_context.h Introduce CPU_SEQID_UNSTABLE 2020-11-02 11:51:12 -08:00
zfs_debug.h
zfs_delay.h
zfs_file.h Re-share zfsdev_getminor and zfs_onexit_fd_hold 2020-02-28 14:50:32 -08:00
zfs_fuid.h Replace sprintf()->snprintf() and strcpy()->strlcpy() 2020-06-07 11:42:12 -07:00
zfs_ioctl_impl.h Make zc_nvlist_src_size limit tunable 2020-08-18 09:33:55 -07:00
zfs_ioctl.h Cross-platform acltype 2020-10-13 21:25:48 -07:00
zfs_onexit.h Remove deduplicated send/receive code 2020-04-23 10:06:57 -07:00
zfs_project.h
zfs_quota.h File incorrectly zeroed when receiving incremental stream that toggles -L 2020-06-09 10:41:01 -07:00
zfs_ratelimit.h
zfs_refcount.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
zfs_rlock.h Add a "try" operation for range locks 2020-07-06 11:53:31 -07:00
zfs_sa.h
zfs_stat.h
zfs_sysfs.h
zfs_vfsops.h Add 'zfs rename -u' to rename without remounting 2020-09-01 16:14:16 -07:00
zfs_vnops.h Remove redundant oid parameter to update_pages 2020-11-10 10:54:30 -08:00
zfs_znode.h G/C struct znode -> z_moved 2020-11-10 12:42:47 -08:00
zil_impl.h
zil.h zil_parse: make callback parameters const 2020-10-09 09:34:54 -07:00
zio_checksum.h
zio_compress.h Add zstd support to zfs 2020-08-20 10:30:06 -07:00
zio_crypt.h Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
zio_impl.h Add zstd support to zfs 2020-08-20 10:30:06 -07:00
zio_priority.h Add device rebuild feature 2020-07-03 11:05:50 -07:00
zio.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
zrlock.h
zthr.h Introduce names for ZTHRs 2020-07-29 09:43:33 -07:00
zvol_impl.h Fix problems in zvol_set_volmode_impl 2020-11-17 09:50:52 -08:00
zvol.h async zvol minor node creation interferes with receive 2020-02-03 09:33:14 -08:00