From d9cd66e45f285356624d26eb92e10e2baf2738ee Mon Sep 17 00:00:00 2001 From: Matthew Ahrens Date: Wed, 12 Jun 2019 13:06:55 -0700 Subject: [PATCH] Target ARC size can get reduced to arc_c_min Sometimes the target ARC size is reduced to arc_c_min, which impacts performance. We've seen this happen as part of the random_reads performance regression test, where the ARC size is reduced before the reads test starts which impacts how long it takes for system to reach good IOPS performance. We call arc_reduce_target_size when arc_reap_cb_check() returns TRUE, and arc_available_memory() is less than arc_c>>arc_shrink_shift. However, arc_available_memory() could easily be low, even when arc_c is low, because we can have tons of unused bufs in the abd kmem cache. This would be especially true just after the DMU requests a bunch of stuff be evicted from the ARC (e.g. due to "zpool export"). To fix this, the ARC should reduce arc_c by the requested amount, not all the way down to arc_size (or arc_c_min), which can be very small. Reviewed-by: Tim Chase Reviewed by: Brian Behlendorf Reviewed-by: George Melikov Signed-off-by: Matthew Ahrens External-issue: DLPX-59431 Closes #8864 --- module/zfs/arc.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/module/zfs/arc.c b/module/zfs/arc.c index c1ffe1f24f..28a6c93c5a 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -4808,8 +4808,6 @@ arc_reduce_target_size(int64_t to_free) if (c > to_free && c - to_free > arc_c_min) { arc_c = c - to_free; atomic_add_64(&arc_p, -(arc_p >> arc_shrink_shift)); - if (asize < arc_c) - arc_c = MAX(asize, arc_c_min); if (arc_p > arc_c) arc_p = (arc_c >> 1); ASSERT(arc_c >= arc_c_min);