Re: git: 73f9251c0b52 - main - Compute 'maxproc'/'maxfiles' from memory amount; Expand/fix comments
- Reply: Olivier Certner : "Re: git: 73f9251c0b52 - main - Compute 'maxproc'/'maxfiles' from memory amount; Expand/fix comments"
- In reply to: Olivier Certner : "git: 73f9251c0b52 - main - Compute 'maxproc'/'maxfiles' from memory amount; Expand/fix comments"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 15 May 2025 15:11:19 UTC
On Thu, May 15, 2025 at 02:23:29PM +0000, Olivier Certner wrote:
> The branch main has been updated by olce:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=73f9251c0b52ac0bfb2f2baff27493d6bae216f6
>
> commit 73f9251c0b52ac0bfb2f2baff27493d6bae216f6
> Author: Olivier Certner <olce@FreeBSD.org>
> AuthorDate: 2025-05-02 12:47:32 +0000
> Commit: Olivier Certner <olce@FreeBSD.org>
> CommitDate: 2025-05-15 14:22:53 +0000
>
> Compute 'maxproc'/'maxfiles' from memory amount; Expand/fix comments
>
> Change the formulae so that 'maxproc' and 'maxfiles' are computed based
> on the physical memory amount, and not the corresponding number of
> pages. Make sure that the practical results are unchanged for all
> architectures (which is possible since all have 4096 as their
> PAGE_SIZE). Despite this, we do this change to make it clearer how many
> units of these values are computed per MB, which is easier on readers.
Not all architectures have PAGE_SIZE of 4K. Not going back to the historic
arches, and out of tree patches for x86, I believe that arm64 has in-tree
support for 16K pages.
VM system is fine with the page sizes from 4K to 32K.
>
> Change the comments accordingly and expand them to indicate which parts
> of the computations are actually not used by default. In passing, fix the
> comments about default values and limits for 'maxfiles' (they were off).
>
> No functional change (intended).
>
> MFC after: 3 days
> Sponsored by: The FreeBSD Foundation
> Differential Revision: https://reviews.freebsd.org/D50124
> ---
> sys/kern/subr_param.c | 44 +++++++++++++++++++++++++++-----------------
> 1 file changed, 27 insertions(+), 17 deletions(-)
>
> diff --git a/sys/kern/subr_param.c b/sys/kern/subr_param.c
> index f4359efec466..471640c290a7 100644
> --- a/sys/kern/subr_param.c
> +++ b/sys/kern/subr_param.c
> @@ -69,13 +69,14 @@
> # define HZ_VM HZ
> # endif
> #endif
> +/* See the comments in init_param2() for these. */
> #define NPROC (20 + 16 * maxusers)
> -#ifndef NBUF
> -#define NBUF 0
> -#endif
> #ifndef MAXFILES
> #define MAXFILES (40 + 32 * maxusers)
> #endif
> +#ifndef NBUF
> +#define NBUF 0
> +#endif
>
> static int sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS);
>
> @@ -275,13 +276,14 @@ init_param1(void)
> void
> init_param2(long physpages)
> {
> + long maxproc_clamp, maxfiles_clamp;
>
> TSENTER();
> /* Base parameters */
> maxusers = MAXUSERS;
> TUNABLE_INT_FETCH("kern.maxusers", &maxusers);
> if (maxusers == 0) {
> - maxusers = physpages / (2 * 1024 * 1024 / PAGE_SIZE);
> + maxusers = pgtok(physpages) / (2 * 1024);
> if (maxusers < 32)
> maxusers = 32;
> #ifdef VM_MAX_AUTOTUNE_MAXUSERS
> @@ -290,35 +292,43 @@ init_param2(long physpages)
> #endif
> /*
> * Scales down the function in which maxusers grows once
> - * we hit 384.
> + * we hit 384 (16MB to get a new "user").
> */
> if (maxusers > 384)
> maxusers = 384 + ((maxusers - 384) / 8);
> }
>
> /*
> - * The following can be overridden after boot via sysctl. Note:
> - * unless overridden, these macros are ultimately based on maxusers.
> - * Limit maxproc so that kmap entries cannot be exhausted by
> - * processes.
> + * The following can be overridden after boot via sysctl. Note: unless
> + * overridden, these macros are ultimately based on 'maxusers'. Limit
> + * maxproc so that kmap entries cannot be exhausted by processes. The
> + * default for 'maxproc' linearly scales as 16 times 'maxusers' (so,
> + * linearly with 8 processes per MB up to 768MB, then 1 process per MB;
> + * overridable by a tunable), and is then clamped at 21 + 1/3 processes
> + * per MB (which never happens by default as long as physical memory is
> + * > ~1.5MB).
> */
> maxproc = NPROC;
> TUNABLE_INT_FETCH("kern.maxproc", &maxproc);
> - if (maxproc > (physpages / 12))
> - maxproc = physpages / 12;
> + maxproc_clamp = pgtok(physpages) / (3 * 1024 / 64);
> + if (maxproc > maxproc_clamp)
> + maxproc = maxproc_clamp;
> if (maxproc > pid_max)
> maxproc = pid_max;
> maxprocperuid = (maxproc * 9) / 10;
>
> /*
> - * The default limit for maxfiles is 1/12 of the number of
> - * physical page but not less than 16 times maxusers.
> - * At most it can be 1/6 the number of physical pages.
> + * 'maxfiles' by default is set to 32 files per MB (overridable by
> + * a tunable), and is then clamped at 64 files per MB (which thus never
> + * happens by default). (The default MAXFILES is for all practical
> + * purposes not used, as it gives a lower value than 32 files per MB as
> + * soon as there is more than ~2.5MB of memory.)
> */
> - maxfiles = imax(MAXFILES, physpages / 8);
> + maxfiles = imax(MAXFILES, pgtok(physpages) / (1024 / 32));
> TUNABLE_INT_FETCH("kern.maxfiles", &maxfiles);
> - if (maxfiles > (physpages / 4))
> - maxfiles = physpages / 4;
> + maxfiles_clamp = pgtok(physpages) / (1024 / 64);
> + if (maxfiles > maxfiles_clamp)
> + maxfiles = maxfiles_clamp;
> maxfilesperproc = (maxfiles / 10) * 9;
> TUNABLE_INT_FETCH("kern.maxfilesperproc", &maxfilesperproc);
>