Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't ignore zfs_arc_max below allmem/32 #10158

Merged
merged 1 commit into from
Apr 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion include/sys/arc_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,7 @@ extern void arc_prune_async(int64_t);
extern int arc_memory_throttle(spa_t *spa, uint64_t reserve, uint64_t txg);
extern uint64_t arc_free_memory(void);
extern int64_t arc_available_memory(void);
extern void arc_tuning_update(void);
extern void arc_tuning_update(boolean_t);

extern int param_set_arc_long(const char *buf, zfs_kernel_param_t *kp);
extern int param_set_arc_int(const char *buf, zfs_kernel_param_t *kp);
Expand Down
4 changes: 2 additions & 2 deletions module/os/linux/zfs/arc_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ param_set_arc_long(const char *buf, zfs_kernel_param_t *kp)
if (error < 0)
return (SET_ERROR(error));

arc_tuning_update();
arc_tuning_update(B_TRUE);

return (0);
}
Expand All @@ -391,7 +391,7 @@ param_set_arc_int(const char *buf, zfs_kernel_param_t *kp)
if (error < 0)
return (SET_ERROR(error));

arc_tuning_update();
arc_tuning_update(B_TRUE);

return (0);
}
Expand Down
40 changes: 28 additions & 12 deletions module/zfs/arc.c
Original file line number Diff line number Diff line change
Expand Up @@ -4558,7 +4558,7 @@ arc_adjust_cb_check(void *arg, zthr_t *zthr)
* their actual internal variable counterparts. Without this,
* changing those module params at runtime would have no effect.
*/
arc_tuning_update();
arc_tuning_update(B_FALSE);

/*
* This is necessary in order to keep the kstat information
Expand Down Expand Up @@ -6900,6 +6900,14 @@ arc_state_multilist_index_func(multilist_t *ml, void *obj)
multilist_get_num_sublists(ml));
}

#define WARN_IF_TUNING_IGNORED(tuning, value, do_warn) do { \
if ((do_warn) && (tuning) && ((tuning) != (value))) { \
cmn_err(CE_WARN, \
"ignoring tunable %s (using %llu instead)", \
(#tuning), (value)); \
} \
} while (0)
This conversation was marked as resolved.
Show resolved Hide resolved
behlendorf marked this conversation as resolved.
Show resolved Hide resolved

/*
* Called during module initialization and periodically thereafter to
* apply reasonable changes to the exposed performance tunings. Can also be
Expand All @@ -6908,11 +6916,20 @@ arc_state_multilist_index_func(multilist_t *ml, void *obj)
* values will be applied.
*/
void
arc_tuning_update(void)
arc_tuning_update(boolean_t verbose)
{
uint64_t allmem = arc_all_memory();
unsigned long limit;

/* Valid range: 32M - <arc_c_max> */
if ((zfs_arc_min) && (zfs_arc_min != arc_c_min) &&
(zfs_arc_min >= 2ULL << SPA_MAXBLOCKSHIFT) &&
(zfs_arc_min <= arc_c_max)) {
arc_c_min = zfs_arc_min;
arc_c = MAX(arc_c, arc_c_min);
}
WARN_IF_TUNING_IGNORED(zfs_arc_min, arc_c_min, verbose);

/* Valid range: 64M - <all physical memory> */
if ((zfs_arc_max) && (zfs_arc_max != arc_c_max) &&
(zfs_arc_max >= 64 << 20) && (zfs_arc_max < allmem) &&
Expand All @@ -6925,14 +6942,7 @@ arc_tuning_update(void)
if (arc_dnode_size_limit > arc_meta_limit)
arc_dnode_size_limit = arc_meta_limit;
}

/* Valid range: 32M - <arc_c_max> */
if ((zfs_arc_min) && (zfs_arc_min != arc_c_min) &&
(zfs_arc_min >= 2ULL << SPA_MAXBLOCKSHIFT) &&
(zfs_arc_min <= arc_c_max)) {
arc_c_min = zfs_arc_min;
arc_c = MAX(arc_c, arc_c_min);
}
WARN_IF_TUNING_IGNORED(zfs_arc_max, arc_c_max, verbose);

/* Valid range: 16M - <arc_c_max> */
if ((zfs_arc_meta_min) && (zfs_arc_meta_min != arc_meta_min) &&
Expand All @@ -6944,6 +6954,7 @@ arc_tuning_update(void)
if (arc_dnode_size_limit < arc_meta_min)
arc_dnode_size_limit = arc_meta_min;
}
WARN_IF_TUNING_IGNORED(zfs_arc_meta_min, arc_meta_min, verbose);

/* Valid range: <arc_meta_min> - <arc_c_max> */
limit = zfs_arc_meta_limit ? zfs_arc_meta_limit :
Expand All @@ -6952,6 +6963,7 @@ arc_tuning_update(void)
(limit >= arc_meta_min) &&
(limit <= arc_c_max))
arc_meta_limit = limit;
WARN_IF_TUNING_IGNORED(zfs_arc_meta_limit, arc_meta_limit, verbose);

/* Valid range: <arc_meta_min> - <arc_meta_limit> */
limit = zfs_arc_dnode_limit ? zfs_arc_dnode_limit :
Expand All @@ -6960,6 +6972,8 @@ arc_tuning_update(void)
(limit >= arc_meta_min) &&
(limit <= arc_meta_limit))
arc_dnode_size_limit = limit;
WARN_IF_TUNING_IGNORED(zfs_arc_dnode_limit, arc_dnode_size_limit,
verbose);

/* Valid range: 1 - N */
if (zfs_arc_grow_retry)
Expand Down Expand Up @@ -6989,11 +7003,13 @@ arc_tuning_update(void)
if ((zfs_arc_lotsfree_percent >= 0) &&
(zfs_arc_lotsfree_percent <= 100))
arc_lotsfree_percent = zfs_arc_lotsfree_percent;
WARN_IF_TUNING_IGNORED(zfs_arc_lotsfree_percent, arc_lotsfree_percent,
verbose);

/* Valid range: 0 - <all physical memory> */
if ((zfs_arc_sys_free) && (zfs_arc_sys_free != arc_sys_free))
arc_sys_free = MIN(MAX(zfs_arc_sys_free, 0), allmem);

WARN_IF_TUNING_IGNORED(zfs_arc_sys_free, arc_sys_free, verbose);
}

static void
Expand Down Expand Up @@ -7183,7 +7199,7 @@ arc_init(void)
arc_dnode_size_limit = (percent * arc_meta_limit) / 100;

/* Apply user specified tunings */
arc_tuning_update();
arc_tuning_update(B_TRUE);

/* if kmem_flags are set, lets try to use less memory */
if (kmem_debugging())
Expand Down