]> git.proxmox.com Git - mirror_zfs.git/commit
Scale worker threads and taskqs with number of CPUs
authorAlexander Motin <mav@FreeBSD.org>
Fri, 14 May 2021 16:13:53 +0000 (12:13 -0400)
committerGitHub <noreply@github.com>
Fri, 14 May 2021 16:13:53 +0000 (09:13 -0700)
commit7457b024ba2be2cf742e07239c20a1c3f3fa9c72
tree4dca78620085f137172d0fac059433e0eebdea70
parent6a13add5596b1390fe79b3d1ba94b07283805f73
Scale worker threads and taskqs with number of CPUs

While use of dynamic taskqs allows to reduce number of idle threads,
hardcoded 8 taskqs of each kind is a big overkill for small systems,
complicating CPU scheduling, increasing I/O reorder, etc, while
providing no real locking benefits, just not needed there.

On another side, 12*8 worker threads per kind are able to overload
almost any system nowadays.  For example, pool of several fast SSDs
with SHA256 checksum makes system barely responsive during scrub, or
with dedup enabled barely responsive during large file deletion.

To address both problems this patch introduces ZTI_SCALE macro, alike
to ZTI_BATCH, but with multiple taskqs, depending on number of CPUs,
to be used in places where lock scalability is needed, while request
ordering is not so much.  The code is made to create new taskq for
~6 worker threads (less for small systems, but more for very large)
up to 80% of CPU cores (previous 75% was not good for rounding down).
Both number of threads and threads per taskq are now tunable in case
somebody really wants to use all of system power for ZFS.

While obviously some benchmarks show small peak performance reduction
(not so big really, especially on systems with SMT, where use of the
second threads does not give as much performance as the first ones),
they also show dramatic latency reduction and much more smooth user-
space operation in case of high CPU usage by ZFS.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored-By: iXsystems, Inc.
Closes #11966
man/man5/zfs-module-parameters.5
module/zfs/spa.c