Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Jun 2019 20:04:28 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r349040 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <201906142004.x5EK4SeW070485@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Fri Jun 14 20:04:28 2019
New Revision: 349040
URL: https://svnweb.freebsd.org/changeset/base/349040

Log:
  Minimize aggsum_compare(&arc_size, arc_c) calls.
  
  For busy ARC situation when arc_size close to arc_c is desired.  But
  then it is quite likely that aggsum_compare(&arc_size, arc_c) will need
  to flush per-CPU buckets to find exact comparison result.  Doing that
  often in a hot path penalizes whole idea of aggsum usage there, since it
  replaces few simple atomic additions with dozens of lock acquisitions.
  
  Replacing aggsum_compare() with aggsum_upper_bound() in code increasing
  arc_p when ARC is growing (arc_size < arc_c) according to PMC profiles
  allows to save ~5% of CPU time in aggsum code during sequential write
  to 12 ZVOLs with 16KB block size on large dual-socket system.
  
  I suppose there some minor arc_p behavior change due to lower precision
  of the new code, but I don't think it is a big deal, since it should
  affect only very small window in time (aggsum buckets are flushed every
  second) and in ARC size (buckets are limited to 10 average ARC blocks
  per CPU).
  
  MFC after:	2 weeks
  Sponsored by:	iXsystems, Inc.

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Fri Jun 14 19:57:32 2019	(r349039)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Fri Jun 14 20:04:28 2019	(r349040)
@@ -5269,7 +5269,7 @@ arc_get_data_impl(arc_buf_hdr_t *hdr, uint64_t size, v
 		 * If we are growing the cache, and we are adding anonymous
 		 * data, and we have outgrown arc_p, update arc_p
 		 */
-		if (aggsum_compare(&arc_size, arc_c) < 0 &&
+		if (aggsum_upper_bound(&arc_size) < arc_c &&
 		    hdr->b_l1hdr.b_state == arc_anon &&
 		    (refcount_count(&arc_anon->arcs_size) +
 		    refcount_count(&arc_mru->arcs_size) > arc_p))



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906142004.x5EK4SeW070485>