Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Aug 2001 01:55:34 -0700
From:      Peter Wemm <peter@wemm.org>
To:        Matt Dillon <dillon@earth.backplane.com>
Cc:        murray@FreeBSD.ORG, jkh@FreeBSD.ORG, hackers@FreeBSD.ORG, Leo Bicknell <bicknell@ufp.org>
Subject:   Re: Proposed patch (-stable) for minor KVM adjustments for the release 
Message-ID:  <20010820085534.271B93905@overcee.netplex.com.au>
In-Reply-To: <200108192046.f7JKkkA46377@earth.backplane.com> 

next in thread | previous in thread | raw e-mail | index | archive | help
Murray/jkh, please do not approve this for MFC until the problems have been
fixed.  For starters, it breaks all platforms other than the i386.

Matt Dillon wrote:
>     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", 
> 
> 

Cheers,
-Peter
--
Peter Wemm - peter@FreeBSD.org; peter@yahoo-inc.com; peter@netplex.com.au
"All of this is for nothing if we don't go to the stars" - JMS/B5


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?20010820085534.271B93905>