svn commit: r337972 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Alexander Motin mav at FreeBSD.org
Fri Aug 17 15:17:10 UTC 2018


Author: mav
Date: Fri Aug 17 15:17:09 2018
New Revision: 337972
URL: https://svnweb.freebsd.org/changeset/base/337972

Log:
  9751 Allocation throttling misplacing ditto blocks
  
  Relax allocation throttling for ditto blocks.  Due to random imbalances
  in allocation it tends to push block copies to one vdev, that looks
  slightly better at the moment.  Slightly less strict policy allows both
  improve data security and surprisingly write performance, since we don't
  need to touch extra metaslabs on each vdev to respect the min distance.
  
  Sponsored by:	iXsystems, Inc.

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c	Fri Aug 17 15:02:58 2018	(r337971)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c	Fri Aug 17 15:17:09 2018	(r337972)
@@ -1081,7 +1081,7 @@ metaslab_group_fragmentation(metaslab_group_t *mg)
  */
 static boolean_t
 metaslab_group_allocatable(metaslab_group_t *mg, metaslab_group_t *rotor,
-    uint64_t psize, int allocator)
+    uint64_t psize, int allocator, int d)
 {
 	spa_t *spa = mg->mg_vd->vdev_spa;
 	metaslab_class_t *mc = mg->mg_class;
@@ -1122,6 +1122,13 @@ metaslab_group_allocatable(metaslab_group_t *mg, metas
 		if (mg->mg_no_free_space)
 			return (B_FALSE);
 
+		/*
+		 * Relax allocation throttling for ditto blocks.  Due to
+		 * random imbalances in allocation it tends to push copies
+		 * to one vdev, that looks a bit better at the moment.
+		 */
+		qmax = qmax * (4 + d) / 4;
+
 		qdepth = refcount_count(&mg->mg_alloc_queue_depth[allocator]);
 
 		/*
@@ -1142,7 +1149,7 @@ metaslab_group_allocatable(metaslab_group_t *mg, metas
 		 */
 		for (mgp = mg->mg_next; mgp != rotor; mgp = mgp->mg_next) {
 			qmax = mgp->mg_cur_max_alloc_queue_depth[allocator];
-
+			qmax = qmax * (4 + d) / 4;
 			qdepth = refcount_count(
 			    &mgp->mg_alloc_queue_depth[allocator]);
 
@@ -3424,7 +3431,7 @@ top:
 		 */
 		if (allocatable && !GANG_ALLOCATION(flags) && !try_hard) {
 			allocatable = metaslab_group_allocatable(mg, rotor,
-			    psize, allocator);
+			    psize, allocator, d);
 		}
 
 		if (!allocatable) {


More information about the svn-src-all mailing list