Go to file
Ned Bass 68cbd56e18 Backfill metadnode more intelligently
Only attempt to backfill lower metadnode object numbers if at least
4096 objects have been freed since the last rescan, and at most once
per transaction group. This avoids a pathology in dmu_object_alloc()
that caused O(N^2) behavior for create-heavy workloads and
substantially improves object creation rates.  As summarized by
@mahrens in #4636:

"Normally, the object allocator simply checks to see if the next
object is available. The slow calls happened when dmu_object_alloc()
checks to see if it can backfill lower object numbers. This happens
every time we move on to a new L1 indirect block (i.e. every 32 *
128 = 4096 objects).  When re-checking lower object numbers, we use
the on-disk fill count (blkptr_t:blk_fill) to quickly skip over
indirect blocks that don’t have enough free dnodes (defined as an L2
with at least 393,216 of 524,288 dnodes free). Therefore, we may
find that a block of dnodes has a low (or zero) fill count, and yet
we can’t allocate any of its dnodes, because they've been allocated
in memory but not yet written to disk. In this case we have to hold
each of the dnodes and then notice that it has been allocated in
memory.

The end result is that allocating N objects in the same TXG can
require CPU usage proportional to N^2."

Add a tunable dmu_rescan_dnode_threshold to define the number of
objects that must be freed before a rescan is performed. Don't bother
to export this as a module option because testing doesn't show a
compelling reason to change it. The vast majority of the performance
gain comes from limit the rescan to at most once per TXG.

Signed-off-by: Ned Bass <bass6@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
2016-06-24 13:13:12 -07:00
cmd Revert "Add a test case for dmu_free_long_range() to ztest" 2016-06-24 12:48:08 -07:00
config Linux 4.7 compat: handler->set() takes both dentry and inode 2016-06-01 18:10:06 -07:00
contrib Fix the test to use the variable 2016-05-13 20:44:03 -07:00
etc Systemd configuration fixes 2016-05-27 11:54:29 -07:00
include Backfill metadnode more intelligently 2016-06-24 13:13:12 -07:00
lib SIMD implementation of vdev_raidz generate and reconstruct routines 2016-06-21 09:27:26 -07:00
man SIMD implementation of vdev_raidz generate and reconstruct routines 2016-06-21 09:27:26 -07:00
module Backfill metadnode more intelligently 2016-06-24 13:13:12 -07:00
rpm Add missing RPM BuildRequires 2016-05-23 10:33:42 -07:00
scripts Add zfs allow and zfs unallow support 2016-06-07 09:16:52 -07:00
tests xattrtest: allow verify with -R and other improvements 2016-06-24 13:12:43 -07:00
udev Add zfs allow and zfs unallow support 2016-06-07 09:16:52 -07:00
.gitignore Ignore *.{deb,rpm,tar.gz} files in the top directory. 2013-04-24 16:18:59 -07:00
.gitmodules Add zimport.sh compatibility test script 2014-02-21 12:10:31 -08:00
AUTHORS Add a missing > to AUTHORS 2014-09-02 14:18:53 -07:00
autogen.sh build: do not call boilerplate ourself 2013-04-02 10:55:20 -07:00
configure.ac SIMD implementation of vdev_raidz generate and reconstruct routines 2016-06-21 09:27:26 -07:00
copy-builtin Fix --enable-linux-builtin 2015-12-02 07:54:32 -08:00
COPYRIGHT Update ZED copyright boilerplate 2015-05-11 15:07:00 -07:00
DISCLAIMER Fix minor typos and update marketing copy. 2013-03-21 12:51:06 -07:00
Makefile.am Add the ZFS Test Suite 2016-03-16 13:46:16 -07:00
META Tag zfs-0.6.5 2015-09-11 11:16:38 -07:00
OPENSOLARIS.LICENSE Add CDDL license file 2008-12-01 14:49:34 -08:00
README.markdown Fix minor typos and update marketing copy. 2013-03-21 12:51:06 -07:00
TEST Add the ZFS Test Suite 2016-03-16 13:46:16 -07:00
zfs-script-config.sh.in SIMD implementation of vdev_raidz generate and reconstruct routines 2016-06-21 09:27:26 -07:00
zfs.release.in Move zfs.release generation to configure step 2012-07-12 12:22:51 -07:00

Native ZFS for Linux!

ZFS is an advanced file system and volume manager which was originally developed for Solaris and is now maintained by the Illumos community.

ZFS on Linux, which is also known as ZoL, is currently feature complete. It includes fully functional and stable SPA, DMU, ZVOL, and ZPL layers.

Full documentation for installing ZoL on your favorite Linux distribution can be found at: http://zfsonlinux.org