]> granicus.if.org Git - zfs/commit
abd_alloc should use scatter for >1K allocations
authorMatthew Ahrens <mahrens@delphix.com>
Fri, 1 Mar 2019 01:52:55 +0000 (17:52 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 1 Mar 2019 01:52:55 +0000 (17:52 -0800)
commit87c25d567fb7969b44c7d8af63990e704fc49dd3
tree61425ec9c66723c15094b2e780fe24368b792347
parent3a1f2d533d471f38a01d33d6ade63e8b5a6377ad
abd_alloc should use scatter for >1K allocations

abd_alloc() normally does scatter allocations, thus solving the problem
that ABD originally set out to: the bulk of ZFS's allocations are single
pages, which are faster to allocate and free, and don't suffer from
internal fragmentation (and the inability to reclaim memory because some
buffers in the slab are still allocated).

However, the current code does linear allocations for 4KB and smaller
allocations, defeating the purpose of ABD.

Scatter ABD's use at least one page each, so sub-page allocations waste
some space when allocated as scatter (e.g. 2KB scatter allocation wastes
half of each page).  Using linear ABD's for small allocations means that
they will be put on slabs which contain many allocations.  This can
improve memory efficiency, but it also makes it much harder for ARC
evictions to actually free pages, because all the buffers on one slab
need to be freed in order for the slab (and underlying pages) to be
freed.  Typically, 512B and 1KB kmem caches have 16 buffers per slab, so
it's possible for them to actually waste more memory than scatter (one
page per buf = wasting 3/4 or 7/8th; one buf per slab = wasting
15/16th).

Spill blocks are typically 512B and are heavily used on systems running
selinux with the default dnode size and the `xattr=sa` property set.

By default we will use linear allocations for 512B and 1KB, and scatter
allocations for larger (1.5KB and up).

Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: DHE <git@dehacked.net>
Reviewed-by: Chunwei Chen <tuxoko@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Don Brady <don.brady@delphix.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #8455
man/man5/zfs-module-parameters.5
module/zfs/abd.c