Reduce number of arc_prune threads
On FreeBSD vnode reclamation is single-threaded, protected by single global lock. Linux seems to be able to use a thread per mount point, but at this time it creates more harm than good. Reduce number of threads to 1, adding tunable in case somebody wants to try more. Reviewed-by: Ryan Moeller <ryan@ixsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Chris Dunlop <chris@onthe.net.au> Reviewed-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Closes #12896 Issue #9966
This commit is contained in:
parent
d2f374c3f2
commit
462217d1c2
|
@ -676,6 +676,13 @@ Minimum time "prescient prefetched" blocks are locked in the ARC.
|
||||||
These blocks are meant to be prefetched fairly aggressively ahead of
|
These blocks are meant to be prefetched fairly aggressively ahead of
|
||||||
the code that may use them.
|
the code that may use them.
|
||||||
.
|
.
|
||||||
|
.It Sy zfs_arc_prune_task_threads Ns = Ns Sy 1 Pq int
|
||||||
|
Number of arc_prune threads.
|
||||||
|
.Fx
|
||||||
|
does not need more than one.
|
||||||
|
Linux may theoretically use one per mount point up to number of CPUs,
|
||||||
|
but that was not proven to be useful.
|
||||||
|
.
|
||||||
.It Sy zfs_max_missing_tvds Ns = Ns Sy 0 Pq int
|
.It Sy zfs_max_missing_tvds Ns = Ns Sy 0 Pq int
|
||||||
Number of missing top-level vdevs which will be allowed during
|
Number of missing top-level vdevs which will be allowed during
|
||||||
pool import (only in read-only mode).
|
pool import (only in read-only mode).
|
||||||
|
|
|
@ -463,6 +463,11 @@ int zfs_arc_meta_strategy = ARC_STRATEGY_META_BALANCED;
|
||||||
int zfs_arc_meta_adjust_restarts = 4096;
|
int zfs_arc_meta_adjust_restarts = 4096;
|
||||||
int zfs_arc_lotsfree_percent = 10;
|
int zfs_arc_lotsfree_percent = 10;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Number of arc_prune threads
|
||||||
|
*/
|
||||||
|
static int zfs_arc_prune_task_threads = 1;
|
||||||
|
|
||||||
/* The 6 states: */
|
/* The 6 states: */
|
||||||
arc_state_t ARC_anon;
|
arc_state_t ARC_anon;
|
||||||
arc_state_t ARC_mru;
|
arc_state_t ARC_mru;
|
||||||
|
@ -7983,9 +7988,8 @@ arc_init(void)
|
||||||
offsetof(arc_prune_t, p_node));
|
offsetof(arc_prune_t, p_node));
|
||||||
mutex_init(&arc_prune_mtx, NULL, MUTEX_DEFAULT, NULL);
|
mutex_init(&arc_prune_mtx, NULL, MUTEX_DEFAULT, NULL);
|
||||||
|
|
||||||
arc_prune_taskq = taskq_create("arc_prune", 100, defclsyspri,
|
arc_prune_taskq = taskq_create("arc_prune", zfs_arc_prune_task_threads,
|
||||||
boot_ncpus, INT_MAX, TASKQ_PREPOPULATE | TASKQ_DYNAMIC |
|
defclsyspri, 100, INT_MAX, TASKQ_PREPOPULATE | TASKQ_DYNAMIC);
|
||||||
TASKQ_THREADS_CPU_PCT);
|
|
||||||
|
|
||||||
arc_ksp = kstat_create("zfs", 0, "arcstats", "misc", KSTAT_TYPE_NAMED,
|
arc_ksp = kstat_create("zfs", 0, "arcstats", "misc", KSTAT_TYPE_NAMED,
|
||||||
sizeof (arc_stats) / sizeof (kstat_named_t), KSTAT_FLAG_VIRTUAL);
|
sizeof (arc_stats) / sizeof (kstat_named_t), KSTAT_FLAG_VIRTUAL);
|
||||||
|
@ -11132,4 +11136,7 @@ ZFS_MODULE_PARAM(zfs_arc, zfs_arc_, eviction_pct, INT, ZMOD_RW,
|
||||||
|
|
||||||
ZFS_MODULE_PARAM(zfs_arc, zfs_arc_, evict_batch_limit, INT, ZMOD_RW,
|
ZFS_MODULE_PARAM(zfs_arc, zfs_arc_, evict_batch_limit, INT, ZMOD_RW,
|
||||||
"The number of headers to evict per sublist before moving to the next");
|
"The number of headers to evict per sublist before moving to the next");
|
||||||
|
|
||||||
|
ZFS_MODULE_PARAM(zfs_arc, zfs_arc_, prune_task_threads, INT, ZMOD_RW,
|
||||||
|
"Number of arc_prune threads");
|
||||||
/* END CSTYLED */
|
/* END CSTYLED */
|
||||||
|
|
Loading…
Reference in New Issue