Go to file
Ned Bass 08d08ebba2 Reduce number of zio free threads
As described in Issue #458 and #258, unlinking large amounts of data
can cause the threads in the zio free wait queue to start spinning.
Reducing the number of z_fr_iss threads from a fixed value of 100 to 1
per cpu signficantly reduces contention on the taskq spinlock and
improves throughput.

Instrumenting the taskq code showed that __taskq_dispatch() can spend
a long time holding tq->tq_lock if there are a large number of threads
in the queue.  It turns out the time spent in wake_up() scales
linearly with the number of threads in the queue.  When a large number
of short work items are dispatched, as seems to be the case with
unlink, the worker threads drain the queue faster than the dispatcher
can fill it.  They then all pile into the work wait queue to wait for
new work items.  So if 100 threads are in the queue, wake_up() takes
about 100 times as long, and the woken threads have to spin until the
dispatcher releases the lock.

Reducing the number of threads helps with the symptoms, but doesn't
get to the root of the problem.  It would seem that wake_up()
shouldn't scale linearly in time with queue depth, particularly if we
are only trying to wake up one thread.  In that vein, I tried making
all of the waiting processes exclusive to prevent the scheduler from
iterating over the entire list, but I still saw the linear time
scaling.  So further investigation is needed, but in the meantime
reducing the thread count is an easy workaround.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #258
Issue #458
2012-01-17 08:54:00 -08:00
cmd Add overlay(-O) mount option support 2012-01-12 15:49:38 -08:00
config Run ZFS_AC_PACMAN only if $VENDOR is "arch" 2012-01-13 09:03:11 -08:00
dracut Linux 3.1 compat, super_block->s_shrink 2012-01-11 11:46:02 -08:00
etc Linux 3.1 compat, super_block->s_shrink 2012-01-11 11:46:02 -08:00
include Increase link count limit to 2^31-1 2012-01-13 11:43:59 -08:00
lib Add overlay(-O) mount option support 2012-01-12 15:49:38 -08:00
man Linux 3.1 compat, super_block->s_shrink 2012-01-11 11:46:02 -08:00
module Reduce number of zio free threads 2012-01-17 08:54:00 -08:00
patches Add build system 2010-08-31 13:41:27 -07:00
scripts Linux 3.1 compat, super_block->s_shrink 2012-01-11 11:46:02 -08:00
udev Linux 3.1 compat, super_block->s_shrink 2012-01-11 11:46:02 -08:00
.gitignore Ignore unsigned module build products 2010-03-09 14:14:09 -08:00
AUTHORS Add "ashift" property to zpool create 2011-06-17 16:35:49 -07:00
autogen.sh Make autogen.sh executable 2011-07-26 10:15:35 -07:00
ChangeLog Add build system 2010-08-31 13:41:27 -07:00
configure Run ZFS_AC_PACMAN only if $VENDOR is "arch" 2012-01-13 09:03:11 -08:00
configure.ac Add make rule for building Arch Linux packages 2011-12-14 19:14:23 -08:00
COPYING Relocate COPYING+COPYRIGHT, remove README cruft 2008-12-01 15:34:53 -08:00
COPYRIGHT Update COPYRIGHT to reference zpios CDDL exceptions. 2010-05-18 14:25:28 -07:00
DISCLAIMER Update COPYRIGHT and DISCLAIMER. 2010-05-18 10:32:23 -07:00
Makefile.am Add make rule for building Arch Linux packages 2011-12-14 19:14:23 -08:00
Makefile.in Linux 3.1 compat, super_block->s_shrink 2012-01-11 11:46:02 -08:00
META Prep zfs-0.6.0-rc6 tag 2011-10-06 14:10:45 -07:00
OPENSOLARIS.LICENSE Add CDDL license file 2008-12-01 14:49:34 -08:00
PKGBUILD-zfs-modules.in Add make rule for building Arch Linux packages 2011-12-14 19:14:23 -08:00
PKGBUILD-zfs.in Add make rule for building Arch Linux packages 2011-12-14 19:14:23 -08:00
README.markdown Fix markdown rendering 2010-09-15 09:09:37 -07:00
zfs_config.h.in Linux 3.2 compat, security_inode_init_security() 2012-01-12 15:06:39 -08:00
zfs-modules.spec.in Fix depmod warning 2011-11-10 10:26:06 -08:00
zfs-script-config.sh.in Unconditionally load core kernel modules 2010-11-11 11:38:25 -08:00
ZFS.RELEASE Update to onnv_147 2010-08-26 14:24:34 -07:00
zfs.spec.in Include distribution in release 2011-10-19 11:43:27 -07:00

Native ZFS for Linux! ZFS is an advanced file system and volume manager which was originally developed for Solaris. It has been successfully ported to FreeBSD and now there is a functional Linux ZFS kernel port too. The port currently includes a fully functional and stable SPA, DMU, and ZVOL with a ZFS Posix Layer (ZPL) on the way!

$ ./configure
$ make pkg

Full documentation for building, configuring, and using ZFS can be found at: http://zfsonlinux.org