]> granicus.if.org Git - zfs/commitdiff
Target ARC size can get reduced to arc_c_min
authorMatthew Ahrens <mahrens@delphix.com>
Wed, 12 Jun 2019 20:06:55 +0000 (13:06 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 12 Jun 2019 20:06:55 +0000 (13:06 -0700)
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 <tim@chase2k.com>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
External-issue: DLPX-59431
Closes #8864

module/zfs/arc.c

index c1ffe1f24f58abf9df6c7ce074e120789b5c1080..28a6c93c5a5f171916ed429947ef76f50cee11c6 100644 (file)
@@ -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);