kern/146108: [zfs] [patch] write throttling bugfix (onnv 9366)

Martin Matuska mm at FreeBSD.org
Wed Apr 28 09:50:04 UTC 2010


>Number:         146108
>Category:       kern
>Synopsis:       [zfs] [patch] write throttling bugfix (onnv 9366)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Apr 28 09:50:04 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Martin Matuska
>Release:        FreeBSD 8.0-STABLE amd64
>Organization:
>Environment:
System: FreeBSD neo.vx.sk 8.0-STABLE FreeBSD 8.0-STABLE #10 r207271M: Tue Apr 27 21:36:49 CEST 2010 root at neo.vx.sk:/usr/obj/stable/sys/NEO amd64
>Description:
- fix improper pool write throughput calculation [1]
- make vfs.zfs.write_limit_override tunable (like in OpenSolaris)

The tunable is in bytes and enables fine-tuning of ZFS write bursts (tradeoff stalls vs. lower write throughput)

Discussed with and approved by: pjd@

MFS suggestion: 2 weeks

Sources:
OpenSolaris bug-id: 6817339 [1]
Onnv revision: 9366 [1]

>How-To-Repeat:
>Fix:
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c	(revision 207314)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c	(working copy)
@@ -47,6 +47,11 @@
 uint64_t zfs_write_limit_override = 0;
 extern uint64_t zfs_write_limit_min;
 
+SYSCTL_DECL(_vfs_zfs);
+TUNABLE_ULONG("vfs.zfs.write_limit_override", &zfs_write_limit_override);
+SYSCTL_ULONG(_vfs_zfs, OID_AUTO, write_limit_override, CTLFLAG_RW, &zfs_write_limit_override, 0,
+	"Override maximum TXG size");
+
 kmutex_t zfs_write_limit_lock;
 
 static pgcnt_t old_physmem = 0;
@@ -300,6 +305,7 @@
 	tx = dmu_tx_create_assigned(dp, txg);
 
 	dp->dp_read_overhead = 0;
+	start = gethrtime();
 	zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
 	while (ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) {
 		if (!list_link_active(&ds->ds_synced_link))
@@ -310,7 +316,6 @@
 	}
 	DTRACE_PROBE(pool_sync__1setup);
 
-	start = gethrtime();
 	err = zio_wait(zio);
 	write_time = gethrtime() - start;
 	ASSERT(err == 0);
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list