Skip site navigation (1)Skip section navigation (2)
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>