Files
mirror_zfs/include/sys
Olaf Faaland 4c5b89f59e Improved dnode allocation and dmu_hold_impl()
Refactor dmu_object_alloc_dnsize() and dnode_hold_impl() to simplify the
code, fix errors introduced by commit dbeb879 (PR #6117) interacting
badly with large dnodes, and improve performance.

* When allocating a new dnode in dmu_object_alloc_dnsize(), update the
percpu object ID for the core's metadnode chunk immediately.  This
eliminates most lock contention when taking the hold and creating the
dnode.

* Correct detection of the chunk boundary to work properly with large
dnodes.

* Separate the dmu_hold_impl() code for the FREE case from the code for
the ALLOCATED case to make it easier to read.

* Fully populate the dnode handle array immediately after reading a
block of the metadnode from disk.  Subsequently the dnode handle array
provides enough information to determine which dnode slots are in use
and which are free.

* Add several kstats to allow the behavior of the code to be examined.

* Verify dnode packing in large_dnode_008_pos.ksh.  Since the test is
purely creates, it should leave very few holes in the metadnode.

* Add test large_dnode_009_pos.ksh, which performs concurrent creates
and deletes, to complement existing test which does only creates.

With the above fixes, there is very little contention in a test of about
200,000 racing dnode allocations produced by tests 'large_dnode_008_pos'
and 'large_dnode_009_pos'.

name                            type data
dnode_hold_dbuf_hold            4    0
dnode_hold_dbuf_read            4    0
dnode_hold_alloc_hits           4    3804690
dnode_hold_alloc_misses         4    216
dnode_hold_alloc_interior       4    3
dnode_hold_alloc_lock_retry     4    0
dnode_hold_alloc_lock_misses    4    0
dnode_hold_alloc_type_none      4    0
dnode_hold_free_hits            4    203105
dnode_hold_free_misses          4    4
dnode_hold_free_lock_misses     4    0
dnode_hold_free_lock_retry      4    0
dnode_hold_free_overflow        4    0
dnode_hold_free_refcount        4    57
dnode_hold_free_txg             4    0
dnode_allocate                  4    203154
dnode_reallocate                4    0
dnode_buf_evict                 4    23918
dnode_alloc_next_chunk          4    4887
dnode_alloc_race                4    0
dnode_alloc_next_block          4    18

The performance is slightly improved for concurrent creates with
16+ threads, and unchanged for low thread counts.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
Closes #5396 
Closes #6522 
Closes #6414 
Closes #6564
2017-09-05 16:15:04 -07:00
..
2017-08-14 10:36:48 -07:00
2017-08-14 10:36:48 -07:00
2017-06-30 11:11:01 -07:00
2017-08-14 10:36:48 -07:00
2017-08-14 10:36:48 -07:00
2016-01-08 15:08:19 -08:00
2017-08-14 10:36:48 -07:00
2017-08-14 10:36:48 -07:00
2017-08-14 10:36:48 -07:00
2017-08-23 16:54:24 -07:00
2014-07-29 10:55:29 -07:00
2017-08-14 10:36:48 -07:00
2017-08-14 10:36:48 -07:00
2013-11-04 11:18:14 -08:00
2017-08-14 10:36:48 -07:00
2017-08-14 10:36:48 -07:00
2013-11-04 11:17:48 -08:00
2017-01-03 11:31:18 -06:00
2017-08-14 10:36:48 -07:00
2017-07-25 13:22:20 -04: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-08-14 10:36:48 -07:00
2015-01-06 16:53:24 -08:00
2017-01-03 11:31:18 -06:00
2017-07-13 13:54:00 -04:00
2011-02-10 09:21:43 -08:00
2013-11-04 10:55:25 -08:00
2017-08-21 10:05:16 -07:00
2017-08-21 10:05:16 -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-08-23 16:54:24 -07: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-08-14 10:36:48 -07:00
2017-03-29 12:24:51 -07:00
2017-08-14 10:36:48 -07:00
2017-08-14 10:36:48 -07:00
2016-12-12 10:46:26 -08:00
2017-07-12 13:05:37 -07:00