Saturday, April 29, 2017

Re: 80 users

I'm new to the OpenBSD source, so I welcome correction from someone
who knows more. But, I'll put my neck out and attempt to give a basic
tour of this aspect of the source.

The maxusers entry in the config(8) file is where it all begins.
http://man.openbsd.org/config.8

The figure of 80 seems to be the default used for GENERIC builds for
i386 and amd64. However, the figure is different for some platforms,
like Octeon, where it is 32. You may be interested in the following
source files:
sys/arch/amd64/conf/GENERIC
sys/arch/i386/conf/GENERIC
sys/arch/octeon/conf/GENERIC

The maxusers value gets compiled into the param.o object, see:
sys/conf/param.c
sys/arch/amd64/conf/Makefile.amd64 lines 105-110

Note that in param.c the maxusers value is now called MAXUSERS. In
param.c, MAXUSERS is used to calculated a few values, namely
maxprocess, maxthread, maxfiles, and initialvnodes.

Taking the example of maxprocess and maxthread, we see in
sys/kern/kern.c the following comment:
287 /*
288 * Although process entries are dynamically created,
we still keep
289 * a global limit on the maximum number we will
create. We reserve
290 * the last 5 processes to root. The variable nprocesses is the
291 * current number of processes, maxprocess is the
limit. Similar
292 * rules for threads (struct proc): we reserve the
last 5 to root;
293 * the variable nthreads is the current number of
procs, maxthread is
294 * the limit.
295 */

So, it would appear that in this case the maxprocess value (which is
calculated from MAXUSERS) is a global max. However, as far as I can
tell, it would appear that MAXUSERS is not an absolute limit on the
maximum number of users that can have processes running at a given
time, but is rather a variable used to estimate what resources are
required. (See again the config(8) manpage, which says maxusers is
"Used to size various system tables and maximum operating conditions
in an approximate fashion.".)

Of course, there are the limits imposed upon individual users, but
that is a different mechanism. (See
http://man.openbsd.org/getrlimit.2, RLIMIT_NPROC. kern_fork.c also
implements this limit.)

So, to answer your question, what happens when the process table is
full? Line 301 of kern_fork.c says:
return EAGAIN;

That agrees with:
http://man.openbsd.org/fork.2

In the case of maxfiles, it seems like ENFILE is returned, but I have
not confirmed this:
http://man.openbsd.org/open.2

Mauri ora koutou.

On 4/30/17, Luke Small <lukensmall@gmail.com> wrote:
> As I recall, there is a build configuration of 80 users for some kernel
> components. What happens if the system exceeds that number?
>

No comments:

Post a Comment