Date: Mon, 10 Dec 2001 12:49:24 +0100 From: Andre Oppermann <oppermann@pipeline.ch> To: Matthew Dillon <dillon@apollo.backplane.com> Cc: Kirk McKusick <mckusick@mckusick.com>, Robert Watson <rwatson@FreeBSD.ORG>, arch@FreeBSD.ORG Subject: Re: Patch for auto-default value for maxusers Message-ID: <3C14A144.B3B365E5@pipeline.ch> References: <200112071957.fB7Jvef29774@beastie.mckusick.com> <200112082256.fB8MuwL19001@apollo.backplane.com> <200112082340.fB8NeI329704@apollo.backplane.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Matthew Dillon wrote: > > 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. Sorry, but my vote would go to Mike Silbersack's version of this because he also takes care of adjusting the relations of the individual values to each other. -- Andre > -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 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?3C14A144.B3B365E5>