From 7d82647c6ce15d5d3aeda68cdefcb0470da33476 Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Wed, 7 Oct 2015 13:12:26 +0200 Subject: [PATCH 219/257] ZFS ARC: Ignore the reap delay when under memory pressure Obtained from: ElectroBSD --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c index 8886ddcfeb89..55a1ca4c1ff3 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c @@ -4107,6 +4107,9 @@ arc_kmem_reap_now(void) static unsigned int arc_cache_reapings_skipped = 0; SYSCTL_UINT(_vfs_zfs, OID_AUTO, arc_cache_reapings_skipped, CTLFLAG_RW, &arc_cache_reapings_skipped, 0, "Number of times the ARC caches have not been reaped due to the reap delay"); +static unsigned int arc_cache_reapings_forced = 0; +SYSCTL_UINT(_vfs_zfs, OID_AUTO, arc_cache_reapings_forced, CTLFLAG_RW, + &arc_cache_reapings_forced, 0, "Number of times the ARC caches reap delay was ignored due to memory pressure"); static unsigned int min_arc_reap_delay = 200; SYSCTL_UINT(_vfs_zfs, OID_AUTO, arc_reap_delay_min, CTLFLAG_RW, @@ -4125,11 +4128,17 @@ consider_reaping_arc_caches(void) } now = getsbinuptime(); - if ((now - last_reaping) / SBT_1MS < min_arc_reap_delay) - { - /* Too soon to reap again. */ - arc_cache_reapings_skipped++; - return; + if ((now - last_reaping) / SBT_1MS < min_arc_reap_delay) { + /* + * Skip the reaping unless there's memory pressure + * in which case we would risk vm deadlocks. We don't + * use vm_page_count_severe() as it triggers too late. + */ + if (!vm_page_count_min()) { + arc_cache_reapings_skipped++; + return; + } + arc_cache_reapings_forced++; } #endif arc_kmem_reap_now(); -- 2.11.0