Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 Dec 2001 15:40:18 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Kirk McKusick <mckusick@mckusick.com>, Robert Watson <rwatson@FreeBSD.ORG>, arch@FreeBSD.ORG
Subject:   Patch for auto-default value for maxusers 
Message-ID:  <200112082340.fB8NeI329704@apollo.backplane.com>
References:  <200112071957.fB7Jvef29774@beastie.mckusick.com> <200112082256.fB8MuwL19001@apollo.backplane.com>

next in thread | previous in thread | raw e-mail | index | archive | help
    This patch is against -stable.  It allows maxusers to be set to 0 in
    the kernel config.  It will scale maxusers according to main
    memory, one per megabyte of main memory with a minimum of 32 and
    a maximum of 512.

    I did some preliminary testing of this patch (note: it also includes
    a page->kbyte fix for nbuf sizing).  I had to reorder init_param()
    a bit because it was being called prior to physical memory sizing.
    A review of that would be nice.

					-Matt

Index: usr.sbin/config/mkoptions.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/config/mkoptions.c,v
retrieving revision 1.17.2.2
diff -u -r1.17.2.2 mkoptions.c
--- usr.sbin/config/mkoptions.c	2000/11/21 20:03:38	1.17.2.2
+++ usr.sbin/config/mkoptions.c	2001/12/08 23:26:16
@@ -93,8 +93,8 @@
 	} else
 		up = &users[machine - 1];
 	if (maxusers == 0) {
-		printf("maxusers not specified; %d assumed\n", up->u_default);
-		maxusers = up->u_default;
+		/* printf("maxusers not specified; will auto-size\n"); */
+		maxusers = 0;
 	} else if (maxusers < up->u_min) {
 		printf("minimum of %d maxusers assumed\n", up->u_min);
 		maxusers = up->u_min;
Index: sys/alpha/alpha/machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/alpha/alpha/machdep.c,v
retrieving revision 1.68.2.14
diff -u -r1.68.2.14 machdep.c
--- sys/alpha/alpha/machdep.c	2001/10/04 13:09:36	1.68.2.14
+++ sys/alpha/alpha/machdep.c	2001/12/08 23:12:38
@@ -329,13 +329,14 @@
 	 */
 
 	if (nbuf == 0) {
-		int factor = 4 * BKVASIZE / PAGE_SIZE;
+		int factor = 4 * BKVASIZE / 1024;
+		int kbytes = physmem * (PAGE_SIZE / 1024);
 
 		nbuf = 50;
-		if (physmem > 1024)
-			nbuf += min((physmem - 1024) / factor, 16384 / factor);
-		if (physmem > 16384)
-			nbuf += (physmem - 16384) * 2 / (factor * 5);
+		if (kbytes > 4096)
+			nbuf += min((kbytes - 4096) / factor, 65536 / factor);
+		if (kbytes > 65536)
+			nbuf += (kbytes - 65536) * 2 / (factor * 5);
 		if (maxbcache && nbuf > maxbcache / BKVASIZE)
 			nbuf = maxbcache / BKVASIZE;
 	}
@@ -698,7 +699,7 @@
 	kern_envp = bootinfo.envp;
 
 	/* Do basic tuning, hz etc */
-	init_param();
+	init_param1();
 
 	/*
 	 * Initalize the (temporary) bootstrap console interface, so
@@ -1004,6 +1005,7 @@
 			physmem -= (sz - nsz);
 		}
 	}
+	init_param2(physmem);
 
 	/*
 	 * Initialize error message buffer (at end of core).
Index: sys/i386/i386/machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/machdep.c,v
retrieving revision 1.385.2.20
diff -u -r1.385.2.20 machdep.c
--- sys/i386/i386/machdep.c	2001/10/02 23:34:22	1.385.2.20
+++ sys/i386/i386/machdep.c	2001/12/08 23:11:09
@@ -331,13 +331,14 @@
 	 * factor represents the 1/4 x ram conversion.
 	 */
 	if (nbuf == 0) {
-		int factor = 4 * BKVASIZE / PAGE_SIZE;
+		int factor = 4 * BKVASIZE / 1024;
+		int kbytes = physmem * (PAGE_SIZE / 1024);
 
 		nbuf = 50;
-		if (physmem > 1024)
-			nbuf += min((physmem - 1024) / factor, 16384 / factor);
-		if (physmem > 16384)
-			nbuf += (physmem - 16384) * 2 / (factor * 5);
+		if (kbytes > 4096)
+			nbuf += min((kbytes - 4096) / factor, 65536 / factor);
+		if (kbytes > 65536)
+			nbuf += (kbytes - 65536) * 2 / (factor * 5);
 		if (maxbcache && nbuf > maxbcache / BKVASIZE)
 			nbuf = maxbcache / BKVASIZE;
 	}
@@ -1829,7 +1830,7 @@
 		kern_envp = (caddr_t)bootinfo.bi_envp + KERNBASE;
 
 	/* Init basic tunables, hz etc */
-	init_param();
+	init_param1();
 
 	/*
 	 * make gdt memory segments, the code segment goes up to end of the
@@ -1963,6 +1964,7 @@
 
 	vm86_initialize();
 	getmemsize(first);
+	init_param2(physmem);
 
 	/* now running on new page tables, configured,and u/iom is accessible */
 
Index: sys/kern/subr_param.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/subr_param.c,v
retrieving revision 1.42.2.3
diff -u -r1.42.2.3 subr_param.c
--- sys/kern/subr_param.c	2001/11/03 01:41:08	1.42.2.3
+++ sys/kern/subr_param.c	2001/12/08 23:28:49
@@ -98,33 +98,16 @@
 struct	buf *swbuf;
 
 /*
- * Boot time overrides
+ * Boot time overrides that are not scaled against main memory
  */
 void
-init_param(void)
+init_param1(void)
 {
-
-	/* Base parameters */
-	maxusers = MAXUSERS;
-	TUNABLE_INT_FETCH("kern.maxusers", &maxusers);
 	hz = HZ;
 	TUNABLE_INT_FETCH("kern.hz", &hz);
 	tick = 1000000 / hz;
 	tickadj = howmany(30000, 60 * hz);	/* can adjust 30ms in 60s */
 
-	/* The following can be overridden after boot via sysctl */
-	maxproc = NPROC;
-	TUNABLE_INT_FETCH("kern.maxproc", &maxproc);
-	maxfiles = MAXFILES;
-	TUNABLE_INT_FETCH("kern.maxfiles", &maxfiles);
-	maxprocperuid = maxproc - 1;
-	maxfilesperproc = maxfiles;
-
-	/* Cannot be changed after boot */
-	nsfbufs = NSFBUFS;
-	TUNABLE_INT_FETCH("kern.ipc.nsfbufs", &nsfbufs);
-	nbuf = NBUF;
-	TUNABLE_INT_FETCH("kern.nbuf", &nbuf);
 #ifdef VM_SWZONE_SIZE_MAX
 	maxswzone = VM_SWZONE_SIZE_MAX;
 #endif
@@ -133,8 +116,6 @@
 	maxbcache = VM_BCACHE_SIZE_MAX;
 #endif
 	TUNABLE_INT_FETCH("kern.maxbcache", &maxbcache);
-	ncallout = 16 + maxproc + maxfiles;
-	TUNABLE_INT_FETCH("kern.ncallout", &ncallout);
 
 	maxtsiz = MAXTSIZ;
 	TUNABLE_QUAD_FETCH("kern.maxtsiz", &maxtsiz);
@@ -149,3 +130,45 @@
 	sgrowsiz = SGROWSIZ;
 	TUNABLE_QUAD_FETCH("kern.sgrowsiz", &sgrowsiz);
 }
+
+/*
+ * Boot time overrides that are scaled against main memory
+ */
+void
+init_param2(int physpages)
+{
+
+	/* Base parameters */
+	if ((maxusers = MAXUSERS) == 0) {
+		maxusers = physpages / (1024 * 1024 / PAGE_SIZE);
+		if (maxusers < 32)
+		    maxusers = 32;
+		if (maxusers > 512)
+		    maxusers = 512;
+	}
+	TUNABLE_INT_FETCH("kern.maxusers", &maxusers);
+
+	/*
+	 * The following can be overridden after boot via sysctl.  Note:
+	 * unless overriden, these macros are ultimately based on maxusers.
+	 */
+	maxproc = NPROC;
+	TUNABLE_INT_FETCH("kern.maxproc", &maxproc);
+	maxfiles = MAXFILES;
+	TUNABLE_INT_FETCH("kern.maxfiles", &maxfiles);
+	maxprocperuid = maxproc - 1;
+	maxfilesperproc = maxfiles;
+
+	/*
+	 * Cannot be changed after boot.  Unless overriden, NSFBUFS is based
+	 * on maxusers and NBUF is typically 0 (auto-sized later).
+	 */
+	nsfbufs = NSFBUFS;
+	TUNABLE_INT_FETCH("kern.ipc.nsfbufs", &nsfbufs);
+	nbuf = NBUF;
+	TUNABLE_INT_FETCH("kern.nbuf", &nbuf);
+
+	ncallout = 16 + maxproc + maxfiles;
+	TUNABLE_INT_FETCH("kern.ncallout", &ncallout);
+}
+
Index: sys/pc98/i386/machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/pc98/i386/machdep.c,v
retrieving revision 1.151.2.23
diff -u -r1.151.2.23 machdep.c
--- sys/pc98/i386/machdep.c	2001/10/08 03:29:43	1.151.2.23
+++ sys/pc98/i386/machdep.c	2001/12/08 23:13:11
@@ -344,13 +344,14 @@
 	 * factor represents the 1/4 x ram conversion.
 	 */
 	if (nbuf == 0) {
-		int factor = 4 * BKVASIZE / PAGE_SIZE;
+		int factor = 4 * BKVASIZE / 1024;
+		int kbytes = physmem * (PAGE_SIZE / 1024);
 
 		nbuf = 50;
-		if (physmem > 1024)
-			nbuf += min((physmem - 1024) / factor, 16384 / factor);
-		if (physmem > 16384)
-			nbuf += (physmem - 16384) * 2 / (factor * 5);
+		if (kbytes > 4096)
+			nbuf += min((kbytes - 4096) / factor, 65536 / factor);
+		if (kbytes > 65536)
+			nbuf += (kbytes - 65536) * 2 / (factor * 5);
 		if (maxbcache && nbuf > maxbcache / BKVASIZE)
 			nbuf = maxbcache / BKVASIZE;
 	}
@@ -1880,7 +1881,7 @@
 		kern_envp = (caddr_t)bootinfo.bi_envp + KERNBASE;
 
 	/* Init basic tunables, hz etc */
-	init_param();
+	init_param1();
 
 	/*
 	 * make gdt memory segments, the code segment goes up to end of the
@@ -2014,6 +2015,7 @@
 
 	vm86_initialize();
 	getmemsize(first);
+	init_param2(physmem);
 
 	/* now running on new page tables, configured,and u/iom is accessible */
 
Index: sys/sys/systm.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/systm.h,v
retrieving revision 1.111.2.11
diff -u -r1.111.2.11 systm.h
--- sys/sys/systm.h	2001/12/04 05:57:40	1.111.2.11
+++ sys/sys/systm.h	2001/12/08 23:13:35
@@ -126,7 +126,8 @@
 
 void	cpu_boot __P((int));
 void	cpu_rootconf __P((void));
-void	init_param __P((void));
+void	init_param1 __P((void));
+void	init_param2 __P((int physpages));
 void	tablefull __P((const char *));
 int	addlog __P((const char *, ...)) __printflike(1, 2);
 int	kvprintf __P((char const *, void (*)(int, void*), void *, int,

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




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