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:
parent
d07a16360c
commit
5074bfe8ad
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue