From 06226b5936eefa16372cc370c584f4287bbc58c4 Mon Sep 17 00:00:00 2001 From: DHE Date: Sat, 25 Mar 2017 22:36:28 -0400 Subject: [PATCH] Increase zfs_vdev_async_write_min_active to 2 Resilver operations frequently cause only a small amount of dirty data to be written to disk at a time, resulting in the IO scheduler to only issue 1 write at a time to the resilvering disk. When it is rotational media the drive will often travel past the next sector to be written before receiving a write command from ZFS, significantly delaying the write of the next sector. Raise zfs_vdev_async_write_min_active so that drives are kept fed during resilvering. Reviewed-by: Brian Behlendorf Signed-off-by: DHE Issue #4825 Closes #5926 --- man/man5/zfs-module-parameters.5 | 7 ++++++- module/zfs/vdev_queue.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5 index 72ff0686c7..ec07cda765 100644 --- a/man/man5/zfs-module-parameters.5 +++ b/man/man5/zfs-module-parameters.5 @@ -1052,7 +1052,12 @@ Default value: \fB10\fR. Minimum asynchronous write I/Os active to each device. See the section "ZFS I/O SCHEDULER". .sp -Default value: \fB1\fR. +Lower values are associated with better latency on rotational media but poorer +resilver performance. The default value of 2 was chosen as a compromise. A +value of 3 has been shown to improve resilver performance further at a cost of +further increasing latency. +.sp +Default value: \fB2\fR. .RE .sp diff --git a/module/zfs/vdev_queue.c b/module/zfs/vdev_queue.c index d969cfeed5..2439f2951c 100644 --- a/module/zfs/vdev_queue.c +++ b/module/zfs/vdev_queue.c @@ -148,7 +148,7 @@ uint32_t zfs_vdev_sync_write_min_active = 10; uint32_t zfs_vdev_sync_write_max_active = 10; uint32_t zfs_vdev_async_read_min_active = 1; uint32_t zfs_vdev_async_read_max_active = 3; -uint32_t zfs_vdev_async_write_min_active = 1; +uint32_t zfs_vdev_async_write_min_active = 2; uint32_t zfs_vdev_async_write_max_active = 10; uint32_t zfs_vdev_scrub_min_active = 1; uint32_t zfs_vdev_scrub_max_active = 2;