Files
mirror_zfs/include/sys
Matthew Ahrens dbeb879699 OpenZFS 8199 - multi-threaded dmu_object_alloc()
dmu_object_alloc() is single-threaded, so when multiple threads are
creating files in a single filesystem, they spend a lot of time waiting
for the os_obj_lock.  To improve performance of multi-threaded file
creation, we must make dmu_object_alloc() typically not grab any
filesystem-wide locks.

The solution is to have a "next object to allocate" for each CPU. Each
of these "next object"s is in a different block of the dnode object, so
that concurrent allocation holds dnodes in different dbufs.  When a
thread's "next object" reaches the end of a chunk of objects (by default
4 blocks worth -- 128 dnodes), it will be reset to the per-objset
os_obj_next, which will be increased by a chunk of objects (128).  Only
when manipulating the os_obj_next will we need to grab the os_obj_lock.
This decreases lock contention dramatically, because each thread only
needs to grab the os_obj_lock briefly, once per 128 allocations.

This results in a 70% performance improvement to multi-threaded object
creation (where each thread is creating objects in its own directory),
from 67,000/sec to 115,000/sec, with 8 CPUs.

Work sponsored by Intel Corp.

Authored by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Ned Bass <bass6@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Ported-by: Matthew Ahrens <mahrens@delphix.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>

OpenZFS-issue: https://www.illumos.org/issues/8199
OpenZFS-commit: https://github.com/openzfs/openzfs/pull/374
Closes #4703
Closes #6117
2017-06-09 09:43:26 -07:00
..
2017-04-03 14:23:02 -07:00
2017-05-19 12:33:11 -07:00
2016-11-29 14:34:33 -08:00
2014-08-01 14:28:05 -07:00
2016-01-08 15:08:19 -08:00
2016-09-29 15:55:41 -07:00
2016-06-28 13:47:02 -07:00
2014-07-29 10:55:29 -07:00
2013-11-04 11:18:14 -08:00
2013-11-04 11:17:48 -08:00
2017-01-03 11:31:18 -06:00
2014-08-13 10:35:00 -07:00
2016-04-21 09:49:25 -07:00
2016-06-07 09:16:52 -07:00
2014-07-30 09:20:35 -07:00
2016-06-24 13:13:21 -07:00
2016-12-01 16:39:06 -07:00
2017-05-03 09:31:05 -07:00
2015-01-06 16:53:24 -08:00
2017-01-03 11:31:18 -06:00
2011-02-10 09:21:43 -08:00
2013-11-04 10:55:25 -08:00
2017-05-12 17:28:03 -07:00
2017-01-03 11:31:18 -06:00
2017-03-10 09:51:33 -08:00
2017-03-10 09:51:33 -08:00
2013-12-18 16:46:35 -08:00
2017-03-10 09:51:33 -08:00
2017-03-10 09:51:33 -08:00
2017-03-10 09:51:33 -08:00
2017-03-10 09:51:35 -08:00
2017-03-10 09:51:33 -08:00
2017-03-29 12:24:51 -07:00
2016-12-12 10:46:26 -08:00