Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Oct 2012 17:53:08 +0200
From:      Andre Oppermann <andre@freebsd.org>
To:        vadim_nuclight@mail.ru
Cc:        freebsd-net@freebsd.org, freebsd-current@freebsd.org
Subject:   Re: maxusers (thus mbuf etc.) autotuning capped at 384
Message-ID:  <50880EE4.2090502@freebsd.org>
In-Reply-To: <slrnk8ful4.386.vadim_nuclight@kernblitz.nuclight.ipfw.ru>
References:  <slrnk8ful4.386.vadim_nuclight@kernblitz.nuclight.ipfw.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On 24.10.2012 16:26, Vadim Goncharov wrote:
> Hi,
>
> We have 'maxusers' tunable which affects many other tunables, e.g. number of
> network mbuf/clusters which is often too low on current machines.

The mbuf/cluster limit can be rethought as well.  Since it all comes
out of UMA and is not pre-allocated we could simply set it to
"physpages / 2" or "physpages / 4 * 3".  Relating it to maxusers isn't
meaningful anymore.

In the same area the kern.maxfiles, kern.maxfilesperproc and
kern.ipc.maxsockets need rethinking as well.  For modern systems and
busy servers it should be at least in the 100k area, if not more.
It should have some magic value per GB physical memory as well.

You have to make sure that this is true though:
  kern.maxfiles > kern.ipc.maxsockets > kern.maxfilesperproc

> There is code in sys/kern/subr_param.c:
>
>          if (maxusers == 0) {
> 	        maxusers = physpages / (2 * 1024 * 1024 / PAGE_SIZE);
> 		if (maxusers < 32)
> 		        maxusers = 32;
> 		if (maxusers > 384)
> 		        maxusers = 384;
> 	}
>
> It was capped to 384 for i386 KVM size limits in r89769, so that amd64, not
> constrained to 1Gb KVA, suffers from this. I suspect that 384 may be wrong even
> for i386 today, but let's be conservative and limit maxusers to 384 per 1 Gb of
> KVM, like this:
>
> #define _MAX_MAXUSERS           (((VM_MAX_KERNEL_ADDRESS - \
>      KERNBASE) / (8 * 1024 * 1024)) * 3)
>
>          if (maxusers == 0) {
> 	        maxusers = physpages / (2 * 1024 * 1024 / PAGE_SIZE);
> 		if (maxusers < 32)
> 		        maxusers = 32;
> 		if (maxusers > _MAX_MAXUSERS)
> 		        maxusers = _MAX_MAXUSERS;
> 	}
> #undef _MAX_MAXUSERS

This is very round-about.  Why don't you simply write 384 per GB in
there directly?

Thinking of it these "magic" whatever-per-GB value definitions
should be next to each other in param.h or some other suitable
place.

-- 
Andre




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