Improve sorted scan memory accounting

Since we use two B-trees q_exts_by_size and q_exts_by_addr, we should
count 2x sizeof (range_seg_gap_t) per node.  And since average B-tree
memory efficiency is about 75%, we should increase it to 3x.

Previous code under-counted up to 30% of the memory usage.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored-By: iXsystems, Inc.
Closes #13537
This commit is contained in:
Alexander Motin 2022-06-10 13:01:46 -04:00 committed by Tony Hutter
parent cc565f557b
commit 6ff89fe126
1 changed files with 5 additions and 2 deletions

View File

@ -1268,9 +1268,12 @@ dsl_scan_should_clear(dsl_scan_t *scn)
mutex_enter(&tvd->vdev_scan_io_queue_lock); mutex_enter(&tvd->vdev_scan_io_queue_lock);
queue = tvd->vdev_scan_io_queue; queue = tvd->vdev_scan_io_queue;
if (queue != NULL) { if (queue != NULL) {
/* # extents in exts_by_size = # in exts_by_addr */ /*
* # of extents in exts_by_size = # in exts_by_addr.
* B-tree efficiency is ~75%, but can be as low as 50%.
*/
mused += zfs_btree_numnodes(&queue->q_exts_by_size) * mused += zfs_btree_numnodes(&queue->q_exts_by_size) *
sizeof (range_seg_gap_t) + queue->q_sio_memused; 3 * sizeof (range_seg_gap_t) + queue->q_sio_memused;
} }
mutex_exit(&tvd->vdev_scan_io_queue_lock); mutex_exit(&tvd->vdev_scan_io_queue_lock);
} }