On Thu, Aug 30, 2018 at 09:55:27AM +0300, Paul wrote:
> 30 August 2018, 00:22:14, by "Mark Johnston" <ma...@freebsd.org>:
> 
> > On Wed, Aug 29, 2018 at 12:42:33PM +0300, Paul wrote:
> > > Hello team,
> > > 
> > > 
> > > It seems like a commit on Mar 23 introduced a bug: if during execution of 
> > > arc_adjust()
> > > target is reached after MRU is evicted current code continues evicting 
> > > MFU. Before said
> > > commit, on the step prior to MFU eviction, target value was recalculated 
> > > as:
> > > 
> > >   target = arc_size - arc_c;
> > > 
> > > arc_size here is a global variable that was being updated accordingly, 
> > > during MRU eviction,
> > > hence this expression, resulted in zero or negative target if MRU 
> > > eviction was enough
> > > to reach the original goal.
> > > 
> > > Modern version uses cached value of arc_size, called asize:
> > > 
> > >   target = asize - arc_c;
> > > 
> > > Because asize stays constant during execution of whole body of 
> > > arc_adjust() it means that
> > > above expression will always be evaluated to value > 0, causing MFU to be 
> > > evicted every 
> > > time, even if MRU eviction has reached the goal already. Because of the 
> > > difference in 
> > > nature of MFU and MRU, globally it leads to eventual reduction of amount 
> > > of MFU in ARC 
> > > to dramatic numbers.
> > 
> > Hi Paul,
> > 
> > Your analysis does seem right to me.  I cc'ed the openzfs mailing list
> > so that an actual ZFS expert can chime in; it looks like this behaviour
> > is consistent between FreeBSD, illumos and ZoL.
> > 
> > Have you already tried the obvious "fix" of subtracting total_evicted
> > from the MFU target?
> 
> We are going to apply the asize patch (plus the ameta, as suggested by 
> Richard) and reboot 
> one of our production servers this night or the following.

Just to be explicit, are you testing something equivalent to the patch
at the end of this email?

> Then we have to wait a few days and observer the ARC behaviour.

Thanks!  Please let us know how it goes: we're preparing to release
FreeBSD 12.0 shortly and I'd like to get this fixed in head/ as soon as
possible.

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 1387925c4607..882c04dba50a 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
@@ -4446,6 +4446,12 @@ arc_adjust(void)
                    arc_adjust_impl(arc_mru, 0, target, ARC_BUFC_METADATA);
        }
 
+       /*
+        * Re-sum ARC stats after the first round of evictions.
+        */
+       asize = aggsum_value(&arc_size);
+       ameta = aggsum_value(&arc_meta_used);
+
        /*
         * Adjust MFU size
         *

------------------------------------------
openzfs: openzfs-developer
Permalink: 
https://openzfs.topicbox.com/groups/developer/T10a105c53bcce15c-M1c45cd09114d2ce2e8c9dd26
Delivery options: https://openzfs.topicbox.com/groups/developer/subscription

Reply via email to