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