Changeset View
Changeset View
Standalone View
Standalone View
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
Show First 20 Lines • Show All 352 Lines • ▼ Show 20 Lines | |||||
* These tunables are for performance analysis. | * These tunables are for performance analysis. | ||||
*/ | */ | ||||
uint64_t zfs_arc_max; | uint64_t zfs_arc_max; | ||||
uint64_t zfs_arc_min; | uint64_t zfs_arc_min; | ||||
uint64_t zfs_arc_meta_limit = 0; | uint64_t zfs_arc_meta_limit = 0; | ||||
uint64_t zfs_arc_meta_min = 0; | uint64_t zfs_arc_meta_min = 0; | ||||
int zfs_arc_grow_retry = 0; | int zfs_arc_grow_retry = 0; | ||||
int zfs_arc_shrink_shift = 0; | int zfs_arc_shrink_shift = 0; | ||||
int zfs_arc_no_grow_shift = 0; | |||||
int zfs_arc_p_min_shift = 0; | int zfs_arc_p_min_shift = 0; | ||||
uint64_t zfs_arc_average_blocksize = 8 * 1024; /* 8KB */ | uint64_t zfs_arc_average_blocksize = 8 * 1024; /* 8KB */ | ||||
u_int zfs_arc_free_target = 0; | u_int zfs_arc_free_target = 0; | ||||
/* Absolute min for arc min / max is 16MB. */ | /* Absolute min for arc min / max is 16MB. */ | ||||
static uint64_t arc_abs_min = 16 << 20; | static uint64_t arc_abs_min = 16 << 20; | ||||
boolean_t zfs_compressed_arc_enabled = B_TRUE; | boolean_t zfs_compressed_arc_enabled = B_TRUE; | ||||
static int sysctl_vfs_zfs_arc_free_target(SYSCTL_HANDLER_ARGS); | static int sysctl_vfs_zfs_arc_free_target(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_vfs_zfs_arc_meta_limit(SYSCTL_HANDLER_ARGS); | static int sysctl_vfs_zfs_arc_meta_limit(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_vfs_zfs_arc_max(SYSCTL_HANDLER_ARGS); | static int sysctl_vfs_zfs_arc_max(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_vfs_zfs_arc_min(SYSCTL_HANDLER_ARGS); | static int sysctl_vfs_zfs_arc_min(SYSCTL_HANDLER_ARGS); | ||||
static int sysctl_vfs_zfs_arc_no_grow_shift(SYSCTL_HANDLER_ARGS); | |||||
#if defined(__FreeBSD__) && defined(_KERNEL) | #if defined(__FreeBSD__) && defined(_KERNEL) | ||||
static void | static void | ||||
arc_free_target_init(void *unused __unused) | arc_free_target_init(void *unused __unused) | ||||
{ | { | ||||
zfs_arc_free_target = vm_pageout_wakeup_thresh; | zfs_arc_free_target = vm_pageout_wakeup_thresh; | ||||
} | } | ||||
SYSINIT(arc_free_target_init, SI_SUB_KTHREAD_PAGE, SI_ORDER_ANY, | SYSINIT(arc_free_target_init, SI_SUB_KTHREAD_PAGE, SI_ORDER_ANY, | ||||
arc_free_target_init, NULL); | arc_free_target_init, NULL); | ||||
TUNABLE_QUAD("vfs.zfs.arc_meta_limit", &zfs_arc_meta_limit); | TUNABLE_QUAD("vfs.zfs.arc_meta_limit", &zfs_arc_meta_limit); | ||||
TUNABLE_QUAD("vfs.zfs.arc_meta_min", &zfs_arc_meta_min); | TUNABLE_QUAD("vfs.zfs.arc_meta_min", &zfs_arc_meta_min); | ||||
TUNABLE_INT("vfs.zfs.arc_shrink_shift", &zfs_arc_shrink_shift); | TUNABLE_INT("vfs.zfs.arc_shrink_shift", &zfs_arc_shrink_shift); | ||||
TUNABLE_INT("vfs.zfs.arc_grow_retry", &zfs_arc_grow_retry); | |||||
TUNABLE_INT("vfs.zfs.arc_no_grow_shift", &zfs_arc_no_grow_shift); | |||||
SYSCTL_DECL(_vfs_zfs); | SYSCTL_DECL(_vfs_zfs); | ||||
SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_max, CTLTYPE_U64 | CTLFLAG_RWTUN, | SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_max, CTLTYPE_U64 | CTLFLAG_RWTUN, | ||||
0, sizeof(uint64_t), sysctl_vfs_zfs_arc_max, "QU", "Maximum ARC size"); | 0, sizeof(uint64_t), sysctl_vfs_zfs_arc_max, "QU", "Maximum ARC size"); | ||||
SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_min, CTLTYPE_U64 | CTLFLAG_RWTUN, | SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_min, CTLTYPE_U64 | CTLFLAG_RWTUN, | ||||
0, sizeof(uint64_t), sysctl_vfs_zfs_arc_min, "QU", "Minimum ARC size"); | 0, sizeof(uint64_t), sysctl_vfs_zfs_arc_min, "QU", "Minimum ARC size"); | ||||
SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_no_grow_shift, CTLTYPE_U32 | CTLFLAG_RWTUN, | |||||
0, sizeof(uint32_t), sysctl_vfs_zfs_arc_no_grow_shift, "U", | |||||
"log2(fraction of ARC which must be free to allow growing)"); | |||||
SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_average_blocksize, CTLFLAG_RDTUN, | SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_average_blocksize, CTLFLAG_RDTUN, | ||||
&zfs_arc_average_blocksize, 0, | &zfs_arc_average_blocksize, 0, | ||||
"ARC average blocksize"); | "ARC average blocksize"); | ||||
SYSCTL_INT(_vfs_zfs, OID_AUTO, arc_shrink_shift, CTLFLAG_RW, | SYSCTL_INT(_vfs_zfs, OID_AUTO, arc_shrink_shift, CTLFLAG_RW, | ||||
&arc_shrink_shift, 0, | &arc_shrink_shift, 0, | ||||
"log2(fraction of arc to reclaim)"); | "log2(fraction of arc to reclaim)"); | ||||
SYSCTL_INT(_vfs_zfs, OID_AUTO, arc_grow_retry, CTLFLAG_RW, | |||||
&arc_grow_retry, 0, | |||||
"Wait in seconds before considering growing ARC"); | |||||
SYSCTL_INT(_vfs_zfs, OID_AUTO, compressed_arc_enabled, CTLFLAG_RDTUN, | SYSCTL_INT(_vfs_zfs, OID_AUTO, compressed_arc_enabled, CTLFLAG_RDTUN, | ||||
&zfs_compressed_arc_enabled, 0, "Enable compressed ARC"); | &zfs_compressed_arc_enabled, 0, "Enable compressed ARC"); | ||||
/* | /* | ||||
* We don't have a tunable for arc_free_target due to the dependency on | * We don't have a tunable for arc_free_target due to the dependency on | ||||
* pagedaemon initialisation. | * pagedaemon initialisation. | ||||
*/ | */ | ||||
SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_free_target, | SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_free_target, | ||||
▲ Show 20 Lines • Show All 653 Lines • ▼ Show 20 Lines | return (err); | ||||
if (val <= 0 || val > arc_c_max) | if (val <= 0 || val > arc_c_max) | ||||
return (EINVAL); | return (EINVAL); | ||||
arc_meta_limit = val; | arc_meta_limit = val; | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
sysctl_vfs_zfs_arc_no_grow_shift(SYSCTL_HANDLER_ARGS) | |||||
{ | |||||
uint32_t val; | |||||
int err; | |||||
val = arc_no_grow_shift; | |||||
err = sysctl_handle_32(oidp, &val, 0, req); | |||||
if (err != 0 || req->newptr == NULL) | |||||
return (err); | |||||
if (val >= arc_shrink_shift) | |||||
return (EINVAL); | |||||
arc_no_grow_shift = val; | |||||
return (0); | |||||
} | |||||
static int | |||||
sysctl_vfs_zfs_arc_max(SYSCTL_HANDLER_ARGS) | sysctl_vfs_zfs_arc_max(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
uint64_t val; | uint64_t val; | ||||
int err; | int err; | ||||
val = zfs_arc_max; | val = zfs_arc_max; | ||||
err = sysctl_handle_64(oidp, &val, 0, req); | err = sysctl_handle_64(oidp, &val, 0, req); | ||||
if (err != 0 || req->newptr == NULL) | if (err != 0 || req->newptr == NULL) | ||||
▲ Show 20 Lines • Show All 5,424 Lines • ▼ Show 20 Lines | #endif | ||||
} | } | ||||
if (zfs_arc_grow_retry > 0) | if (zfs_arc_grow_retry > 0) | ||||
arc_grow_retry = zfs_arc_grow_retry; | arc_grow_retry = zfs_arc_grow_retry; | ||||
if (zfs_arc_shrink_shift > 0) | if (zfs_arc_shrink_shift > 0) | ||||
arc_shrink_shift = zfs_arc_shrink_shift; | arc_shrink_shift = zfs_arc_shrink_shift; | ||||
if (zfs_arc_no_grow_shift > 0) | |||||
arc_no_grow_shift = zfs_arc_no_grow_shift; | |||||
/* | /* | ||||
* Ensure that arc_no_grow_shift is less than arc_shrink_shift. | * Ensure that arc_no_grow_shift is less than arc_shrink_shift. | ||||
*/ | */ | ||||
if (arc_no_grow_shift >= arc_shrink_shift) | if (arc_no_grow_shift >= arc_shrink_shift) | ||||
arc_no_grow_shift = arc_shrink_shift - 1; | arc_no_grow_shift = arc_shrink_shift - 1; | ||||
if (zfs_arc_p_min_shift > 0) | if (zfs_arc_p_min_shift > 0) | ||||
arc_p_min_shift = zfs_arc_p_min_shift; | arc_p_min_shift = zfs_arc_p_min_shift; | ||||
▲ Show 20 Lines • Show All 1,307 Lines • Show Last 20 Lines |