]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
OpenZFS 8199 - multi-threaded dmu_object_alloc()
authorMatthew Ahrens <mahrens@delphix.com>
Fri, 13 May 2016 04:16:36 +0000 (21:16 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 9 Jun 2017 16:43:26 +0000 (09:43 -0700)
commitdbeb8796996b4a342f7de2b3eb4ea5b86ac260f9
tree63a722cfe2ae86634005064399b5672e3694eeb8
parent1b7c1e5ce90ae27d9bb1f6f3616bf079c168005c
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
include/sys/dmu_objset.h
module/zfs/dmu_object.c
module/zfs/dmu_objset.c
module/zfs/zfs_znode.c