Allocate zfs_znode_cache on the Linux slab

The Linux slab, in general, performs better than the SPl slab in cases
where a lot of objects are allocated and fragmentation is likely present.

This patch fixes pathologically bad behavior in cases where the ARC is
filled with mostly metadata and a user program needs to allocate and
dirty enough memory which would require an insignificant amount of the
ARC to be reclaimed.

If zfs_znode_cache is on the SPL slab, the system may spin for a very
long time trying to reclaim sufficient memory.  If it is on the Linux
slab, the behavior has been observed to be much more predictible; the
memory is reclaimed more efficiently.

Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #3283
This commit is contained in:
Tim Chase 2015-04-14 01:06:40 -04:00 committed by Brian Behlendorf
parent d07a16360c
commit 5074bfe8ad
1 changed files with 4 additions and 2 deletions

View File

@ -147,12 +147,14 @@ void
zfs_znode_init(void) zfs_znode_init(void)
{ {
/* /*
* Initialize zcache * Initialize zcache. The KMC_SLAB hint is used in order that it be
* backed by kmalloc() when on the Linux slab in order that any
* wait_on_bit() operations on the related inode operate properly.
*/ */
ASSERT(znode_cache == NULL); ASSERT(znode_cache == NULL);
znode_cache = kmem_cache_create("zfs_znode_cache", znode_cache = kmem_cache_create("zfs_znode_cache",
sizeof (znode_t), 0, zfs_znode_cache_constructor, sizeof (znode_t), 0, zfs_znode_cache_constructor,
zfs_znode_cache_destructor, NULL, NULL, NULL, KMC_KMEM); zfs_znode_cache_destructor, NULL, NULL, NULL, KMC_SLAB);
} }
void void