]> git.proxmox.com Git - mirror_zfs.git/commit - module/zfs/spa.c
Improve log spacemap load time
authorAlexander Motin <mav@FreeBSD.org>
Tue, 26 Apr 2022 17:44:21 +0000 (13:44 -0400)
committerGitHub <noreply@github.com>
Tue, 26 Apr 2022 17:44:21 +0000 (10:44 -0700)
commit600a02b8844edb16b88b9bb179d1fbd7a169037d
tree3b089446cb0c3612d5abed8f4c2166ce36bf56c8
parent0409d3327371cef8a8c5886cb7530ded6f5f1091
Improve log spacemap load time

Previous flushing algorithm limited only total number of log blocks to
the minimum of 256K and 4x number of metaslabs in the pool.  As result,
system with 1500 disks with 1000 metaslabs each, touching several new
metaslabs each TXG could grow spacemap log to huge size without much
benefits.  We've observed one of such systems importing pool for about
45 minutes.

This patch improves the situation from five sides:
 - By limiting maximum period for each metaslab to be flushed to 1000
TXGs, that effectively limits maximum number of per-TXG spacemap logs
to load to the same number.
 - By making flushing more smooth via accounting number of metaslabs
that were touched after the last flush and actually need another flush,
not just ms_unflushed_txg bump.
 - By applying zfs_unflushed_log_block_pct to the number of metaslabs
that were touched after the last flush, not all metaslabs in the pool.
 - By aggressively prefetching per-TXG spacemap logs up to 16 TXGs in
advance, making log spacemap load process for wide HDD pool CPU-bound,
accelerating it by many times.
 - By reducing zfs_unflushed_log_block_max from 256K to 128K, reducing
single-threaded by nature log processing time from ~10 to ~5 minutes.

As further optimization we could skip bumping ms_unflushed_txg for
metaslabs not touched since the last flush, but that would be an
incompatible change, requiring new pool feature.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored-By: iXsystems, Inc.
Closes #12789
include/sys/dmu.h
include/sys/metaslab.h
include/sys/metaslab_impl.h
include/sys/spa_log_spacemap.h
man/man4/zfs.4
module/zfs/dmu.c
module/zfs/metaslab.c
module/zfs/spa.c
module/zfs/spa_log_spacemap.c
module/zfs/vdev.c
module/zfs/vdev_removal.c