Reduce minimal scrub/resilver times

With higher throughput and lower latency of modern devices ZFS can
happily live with pretty short (fractions of a second) TXGs.  But
the two decade old multi-second minimal time limits can almost stop
payload writes by extending TXGs beyond dirty data limits of ARC
ability to amortize it.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <alexander.motin@TrueNAS.com>
Closes #18060
This commit is contained in:
Alexander Motin 2025-12-18 13:21:45 -05:00 committed by GitHub
parent 1d43387dd8
commit a83bb15fcd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 4 additions and 4 deletions

View File

@ -2116,7 +2116,7 @@ even if the
.Sy resilver_defer .Sy resilver_defer
feature is enabled. feature is enabled.
. .
.It Sy zfs_resilver_min_time_ms Ns = Ns Sy 3000 Ns ms Po 3 s Pc Pq uint .It Sy zfs_resilver_min_time_ms Ns = Ns Sy 1500 Ns ms Pq uint
Resilvers are processed by the sync thread. Resilvers are processed by the sync thread.
While resilvering, it will spend at least this much time While resilvering, it will spend at least this much time
working on a resilver between TXG flushes. working on a resilver between TXG flushes.
@ -2133,7 +2133,7 @@ in order to verify the checksums of all blocks which have been
copied during the expansion. copied during the expansion.
This is enabled by default and strongly recommended. This is enabled by default and strongly recommended.
. .
.It Sy zfs_scrub_min_time_ms Ns = Ns Sy 1000 Ns ms Po 1 s Pc Pq uint .It Sy zfs_scrub_min_time_ms Ns = Ns Sy 750 Ns ms Pq uint
Scrubs are processed by the sync thread. Scrubs are processed by the sync thread.
While scrubbing, it will spend at least this much time While scrubbing, it will spend at least this much time
working on a scrub between TXG flushes. working on a scrub between TXG flushes.

View File

@ -189,7 +189,7 @@ static uint_t zfs_scan_mem_lim_fact = 20;
static uint_t zfs_scan_mem_lim_soft_fact = 20; static uint_t zfs_scan_mem_lim_soft_fact = 20;
/* minimum milliseconds to scrub per txg */ /* minimum milliseconds to scrub per txg */
static uint_t zfs_scrub_min_time_ms = 1000; static uint_t zfs_scrub_min_time_ms = 750;
/* minimum milliseconds to obsolete per txg */ /* minimum milliseconds to obsolete per txg */
static uint_t zfs_obsolete_min_time_ms = 500; static uint_t zfs_obsolete_min_time_ms = 500;
@ -198,7 +198,7 @@ static uint_t zfs_obsolete_min_time_ms = 500;
static uint_t zfs_free_min_time_ms = 500; static uint_t zfs_free_min_time_ms = 500;
/* minimum milliseconds to resilver per txg */ /* minimum milliseconds to resilver per txg */
static uint_t zfs_resilver_min_time_ms = 3000; static uint_t zfs_resilver_min_time_ms = 1500;
static uint_t zfs_scan_checkpoint_intval = 7200; /* in seconds */ static uint_t zfs_scan_checkpoint_intval = 7200; /* in seconds */
int zfs_scan_suspend_progress = 0; /* set to prevent scans from progressing */ int zfs_scan_suspend_progress = 0; /* set to prevent scans from progressing */