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>