Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Aug 2001 13:46:46 -0700 (PDT)
From:      Matt Dillon <dillon@earth.backplane.com>
To:        <murray@FreeBSD.ORG>, <jkh@FreeBSD.ORG>, <hackers@FreeBSD.ORG>
Cc:        Leo Bicknell <bicknell@ufp.org>, Peter Wemm <peter@wemm.org>
Subject:   Proposed patch (-stable) for minor KVM adjustments for the release
Message-ID:  <200108192046.f7JKkkA46377@earth.backplane.com>
References:   <Pine.LNX.4.33L.0108190007320.5646-100000@imladris.rielhome.conectiva>

next in thread | previous in thread | raw e-mail | index | archive | help
    Here is my proposed patch.  It adds to options (overrides) to the kernel
    config, two boot-time tunables for same, and sets reasonable defaults.
    I also changed the default auto-sizing calculation for swap-meta from
    32x physical pages to 16x physical pages on top of it being capped.
    I only made a small change there since we cannot really afford to run
    out of swap-meta structures (the system will probably lockup if we do).

    This patch is against -stable.  I will commit it to -current today and
    await the release-engineers permission to MFC it to -stable for the
    release.  I did some simple testing under -stable, including bumping up
    maxusers and NMBCLUSTERS.

						-Matt

Index: conf/options
===================================================================
RCS file: /home/ncvs/src/sys/conf/options,v
retrieving revision 1.191.2.35
diff -u -r1.191.2.35 options
--- conf/options	2001/08/03 00:47:27	1.191.2.35
+++ conf/options	2001/08/19 20:00:29
@@ -163,6 +163,8 @@
 NBUF		opt_param.h
 NMBCLUSTERS	opt_param.h
 NSFBUFS		opt_param.h
+VM_BCACHE_SIZE_MAX	opt_param.h
+VM_SWZONE_SIZE_MAX	opt_param.h
 MAXUSERS
 
 # Generic SCSI options.
Index: i386/conf/LINT
===================================================================
RCS file: /home/ncvs/src/sys/i386/conf/Attic/LINT,v
retrieving revision 1.749.2.77
diff -u -r1.749.2.77 LINT
--- i386/conf/LINT	2001/08/15 01:23:49	1.749.2.77
+++ i386/conf/LINT	2001/08/19 20:27:02
@@ -2315,7 +2315,44 @@
 #
 options 	NSFBUFS=1024
 
+# Set the size of the buffer cache KVM reservation, in buffers.  This is
+# scaled by approximately 16384 bytes.  The system will auto-size the buffer
+# cache if this option is not specified or set to 0.
 #
+options 	NBUF=512
+
+# Set the size of the mbuf KVM reservation, in clusters.  This is scaled
+# by approximately 2048 bytes.  The system will auto-size the mbuf area
+# if this options is not specified or set to 0.
+#
+options 	NMBCLUSTERS=1024
+
+# Tune the kernel malloc area parameters.  VM_KMEM_SIZE represents the 
+# minimum, in bytes, and is typically (12*1024*1024) (12MB). 
+# VM_KMEM_SIZE_MAX represents the maximum, typically 200 megabytes.
+# VM_KMEM_SIZE_SCALE can be set to adjust the auto-tuning factor, which
+# typically defaults to 4 (kernel malloc area size is physical memory 
+# divided by the scale factor).
+#
+options 	VM_KMEM_SIZE="(10*1024*1024)"
+options 	VM_KMEM_SIZE_MAX="(100*1024*1024)"
+options 	VM_KMEM_SIZE_SCALE="4"
+
+# Tune the buffer cache maximum KVA reservation, in bytes.  The maximum is
+# usually capped at 200 MB, effecting machines with > 1GB of ram.  Note
+# that the buffer cache only really governs write buffering and disk block
+# translations.  The VM page cache is our primary disk cache and is not
+# effected by the size of the buffer cache.
+#
+options		VM_BCACHE_SIZE_MAX="(100*1024*1024)"
+
+# Tune the swap zone KVA reservation, in bytes.  The default is typically
+# 70 MB, giving the system the ability to manage a maximum of 28GB worth
+# of swapped out data.  
+#
+options		VM_SWZONE_SIZE_MAX="(50*1024*1024)"
+
+#
 # Enable extra debugging code for locks.  This stores the filename and
 # line of whatever acquired the lock in the lock itself, and change a
 # number of function calls to pass around the relevant data.  This is
@@ -2500,9 +2537,7 @@
 options 	KEY
 options 	LOCKF_DEBUG
 options 	LOUTB
-options 	NBUF=512
 options 	NETATALKDEBUG
-options 	NMBCLUSTERS=1024
 #options 	OLTR_NO_BULLSEYE_MAC
 #options 	OLTR_NO_HAWKEYE_MAC
 #options 	OLTR_NO_TMS_MAC
@@ -2521,7 +2556,5 @@
 options 	SPX_HACK
 options 	TIMER_FREQ="((14318182+6)/12)"
 options 	VFS_BIO_DEBUG
-options 	VM_KMEM_SIZE
-options 	VM_KMEM_SIZE_MAX
-options 	VM_KMEM_SIZE_SCALE
 options		XBONEHACK
+
Index: i386/i386/machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/machdep.c,v
retrieving revision 1.385.2.15
diff -u -r1.385.2.15 machdep.c
--- i386/i386/machdep.c	2001/07/30 23:27:59	1.385.2.15
+++ i386/i386/machdep.c	2001/08/19 20:36:19
@@ -320,7 +320,9 @@
 	 * The nominal buffer size (and minimum KVA allocation) is BKVASIZE.
 	 * For the first 64MB of ram nominally allocate sufficient buffers to
 	 * cover 1/4 of our ram.  Beyond the first 64MB allocate additional
-	 * buffers to cover 1/20 of our ram over 64MB.
+	 * buffers to cover 1/20 of our ram over 64MB.  When auto-sizing
+	 * the buffer cache we limit the eventual kva reservation to
+	 * maxbcache bytes.
 	 *
 	 * factor represents the 1/4 x ram conversion.
 	 */
@@ -332,6 +334,8 @@
 			nbuf += min((physmem - 1024) / factor, 16384 / factor);
 		if (physmem > 16384)
 			nbuf += (physmem - 16384) * 2 / (factor * 5);
+		if (maxbcache && nbuf > maxbcache / BKVASIZE)
+			nbuf = maxbcache / BKVASIZE;
 	}
 
 	/*
Index: i386/include/param.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/param.h,v
retrieving revision 1.54.2.4
diff -u -r1.54.2.4 param.h
--- i386/include/param.h	2000/12/29 10:59:18	1.54.2.4
+++ i386/include/param.h	2001/08/19 20:07:08
@@ -113,6 +113,22 @@
 #define UPAGES	2		/* pages of u-area */
 
 /*
+ * Ceiling on amount of swblock kva space.
+ */
+#ifndef VM_SWZONE_SIZE_MAX
+#define VM_SWZONE_SIZE_MAX	(70 * 1024 * 1024)
+#endif
+
+/*
+ * Ceiling on size of buffer cache (really only effects write queueing,
+ * the VM page cache is not effected).
+ */
+#ifndef VM_BCACHE_SIZE_MAX
+#define VM_BCACHE_SIZE_MAX	(200 * 1024 * 1024)
+#endif
+
+
+/*
  * Constants related to network buffer management.
  * MCLBYTES must be no larger than CLBYTES (the software page size), and,
  * on machines that exchange pages of input or output buffers with mbuf
Index: kern/subr_param.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/subr_param.c,v
retrieving revision 1.42.2.1
diff -u -r1.42.2.1 subr_param.c
--- kern/subr_param.c	2001/07/30 23:28:00	1.42.2.1
+++ kern/subr_param.c	2001/08/19 20:04:05
@@ -76,6 +76,8 @@
 int	mbuf_wait = 32;			/* mbuf sleep time in ticks */
 int	nbuf;
 int	nswbuf;
+int	maxswzone;			/* max swmeta KVA storage */
+int	maxbcache;			/* max buffer cache KVA storage */
 
 /* maximum # of sf_bufs (sendfile(2) zero-copy virtual buffers) */
 int	nsfbufs;
@@ -115,6 +117,10 @@
 	TUNABLE_INT_FETCH("kern.ipc.nsfbufs", &nsfbufs);
 	nbuf = NBUF;
 	TUNABLE_INT_FETCH("kern.nbuf", &nbuf);
+	maxswzone = VM_SWZONE_SIZE_MAX;
+	TUNABLE_INT_FETCH("kern.maxswzone", &maxswzone);
+	maxbcache = VM_BCACHE_SIZE_MAX;
+	TUNABLE_INT_FETCH("kern.maxbcache", &maxbcache);
 	ncallout = 16 + maxproc + maxfiles;
 	TUNABLE_INT_FETCH("kern.ncallout", &ncallout);
 }
Index: sys/buf.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/buf.h,v
retrieving revision 1.88.2.4
diff -u -r1.88.2.4 buf.h
--- sys/buf.h	2001/06/03 05:00:10	1.88.2.4
+++ sys/buf.h	2001/08/19 19:54:02
@@ -455,6 +455,8 @@
 
 #ifdef _KERNEL
 extern int	nbuf;			/* The number of buffer headers */
+extern int	maxswzone;		/* Max KVA for swap structures */
+extern int	maxbcache;		/* Max KVA for buffer cache */
 extern int	runningbufspace;
 extern int      buf_maxio;              /* nominal maximum I/O for buffer */
 extern struct	buf *buf;		/* The buffer headers. */
Index: vm/swap_pager.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/swap_pager.c,v
retrieving revision 1.130.2.8
diff -u -r1.130.2.8 swap_pager.c
--- vm/swap_pager.c	2001/03/24 20:28:24	1.130.2.8
+++ vm/swap_pager.c	2001/08/19 19:47:19
@@ -300,10 +300,12 @@
 	/*
 	 * Initialize our zone.  Right now I'm just guessing on the number
 	 * we need based on the number of pages in the system.  Each swblock
-	 * can hold 16 pages, so this is probably overkill.
+	 * can hold 16 pages, so this is probably overkill.  This reservation
+	 * is typically limited to around 70MB by default.
 	 */
-
-	n = cnt.v_page_count * 2;
+	n = cnt.v_page_count;
+	if (maxswzone && n > maxswzone / sizeof(struct swblock))
+		n = maxswzone / sizeof(struct swblock);
 
 	swap_zone = zinit(
 	    "SWAPMETA", 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




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