mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
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
This commit is contained in:
@@ -4060,11 +4060,25 @@ Percentage of online CPUs (or CPU cores, etc) which will run a worker thread
|
||||
for I/O. These workers are responsible for I/O work such as compression and
|
||||
checksum calculations. Fractional number of CPUs will be rounded down.
|
||||
.sp
|
||||
The default value of 75 was chosen to avoid using all CPUs which can result in
|
||||
latency issues and inconsistent application performance, especially when high
|
||||
compression is enabled.
|
||||
The default value of 80 was chosen to avoid using all CPUs which can result in
|
||||
latency issues and inconsistent application performance, especially when slower
|
||||
compression and/or checksumming is enabled.
|
||||
.sp
|
||||
Default value: \fB75\fR.
|
||||
Default value: \fB80\fR.
|
||||
.RE
|
||||
|
||||
.sp
|
||||
.ne 2
|
||||
.na
|
||||
\fBzio_taskq_batch_tpq\fR (uint)
|
||||
.ad
|
||||
.RS 12n
|
||||
Number of worker threads per taskq. Lower value improves I/O ordering and
|
||||
CPU utilization, while higher reduces lock contention.
|
||||
.sp
|
||||
By default about 6 worker threads per taskq, depending on system size.
|
||||
.sp
|
||||
Default value: \fB0\fR.
|
||||
.RE
|
||||
|
||||
.sp
|
||||
|
||||
Reference in New Issue
Block a user