zfs/module/os/freebsd/spl
ednadolski-ix 3bd4df3841
Improve ZFS objset sync parallelism
As part of transaction group commit, dsl_pool_sync() sequentially calls
dsl_dataset_sync() for each dirty dataset, which subsequently calls
dmu_objset_sync().  dmu_objset_sync() in turn uses up to 75% of CPU
cores to run sync_dnodes_task() in taskq threads to sync the dirty
dnodes (files).

There are two problems:

1. Each ZVOL in a pool is a separate dataset/objset having a single
   dnode.  This means the objsets are synchronized serially, which
   leads to a bottleneck of ~330K blocks written per second per pool.

2. In the case of multiple dirty dnodes/files on a dataset/objset on a
   big system they will be sync'd in parallel taskq threads. However,
   it is inefficient to to use 75% of CPU cores of a big system to do
   that, because of (a) bottlenecks on a single write issue taskq, and
   (b) allocation throttling.  In addition, if not for the allocation
   throttling sorting write requests by bookmarks (logical address),
   writes for different files may reach space allocators interleaved,
   leading to unwanted fragmentation.

The solution to both problems is to always sync no more and (if
possible) no fewer dnodes at the same time than there are allocators
the pool.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Edmund Nadolski <edmund.nadolski@ixsystems.com>
Closes #15197
2023-11-06 10:38:42 -08:00
..
acl_common.c acl: use uintptr_t for ace walker cookies 2022-11-03 09:51:34 -07:00
callb.c Cleanup: Use NULL when doing NULL pointer comparisons 2023-01-12 16:00:37 -08:00
list.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
spl_acl.c Remove bcopy(), bzero(), bcmp() 2022-03-15 15:13:42 -07:00
spl_atomic.c Update FreeBSD SPL atomics 2020-05-04 15:07:04 -07:00
spl_cmn_err.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
spl_dtrace.c Refactor ccompile.h to not include system headers 2020-07-25 20:09:50 -07:00
spl_kmem.c Enable -Wwrite-strings 2022-06-29 14:08:54 -07:00
spl_kstat.c Restrict visibility of per-dataset kstats inside FreeBSD jails 2022-12-09 11:04:29 -08:00
spl_misc.c Reduce false positives from Static Analyzers 2022-09-30 15:30:12 -07:00
spl_policy.c Share zfs_fsync, zfs_read, zfs_write, et al between Linux and FreeBSD 2020-10-21 14:08:06 -07:00
spl_procfs_list.c FreeBSD: Add support for procfs_list 2020-09-23 16:43:51 -07:00
spl_string.c Introduce kmem_scnprintf() 2022-10-29 13:05:11 -07:00
spl_sunddi.c Remove hw_serial, ddi_strtoul() 2022-05-13 10:15:31 -07:00
spl_sysevent.c nvpair: Constify string functions 2023-03-14 15:25:50 -07:00
spl_taskq.c Improve ZFS objset sync parallelism 2023-11-06 10:38:42 -08:00
spl_uio.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
spl_vfs.c Allow mounting snapshots in .zfs/snapshot as a regular user 2022-11-03 11:53:24 -07:00
spl_vm.c Changes to make openzfs build within FreeBSD buildworld 2020-07-31 21:30:31 -07:00
spl_zlib.c Remove bcopy(), bzero(), bcmp() 2022-03-15 15:13:42 -07:00
spl_zone.c Remove bcopy(), bzero(), bcmp() 2022-03-15 15:13:42 -07:00