[PATCH v4] malloc: Reduce maximum arenas
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Thu Jun 4 14:15:43 GMT 2026
On 04/06/26 10:25, Wilco Dijkstra wrote:
> v4: update after review
>
> The default maximum arenas is 8 times the number of cores in a 64-bit system.
> Since modern CPUs have many cores and big servers have 256 cores, this results
> in excessive number of arenas, which wastes memory. Limit the number of arenas
> to max (8, ncores) which is less extreme. In the future the limit should be
> lowered further for large systems.
>
> Passes regress, OK for commit?
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
> ---
>
> diff --git a/malloc/arena.c b/malloc/arena.c
> index 023cb3ba067d0de097a687b73c81f5d860393413..1ed419a30569f59e169c5c3138e38a2bdb9e5de2 100644
> --- a/malloc/arena.c
> +++ b/malloc/arena.c
> @@ -799,16 +799,11 @@ arena_get2 (size_t size, mstate avoid_arena)
> {
> if (mp_.arena_max != 0)
> narenas_limit = mp_.arena_max;
> - else if (narenas > mp_.arena_test)
> + else if (narenas >= mp_.arena_test)
> {
> - int n = __get_nprocs ();
> -
> - if (n >= 1)
> - narenas_limit = NARENAS_FROM_NCORES (n);
> - else
> - /* We have no information about the system. Assume two
> - cores. */
> - narenas_limit = NARENAS_FROM_NCORES (2);
> + narenas_limit = __get_nprocs ();
> + if (narenas_limit < mp_.arena_test)
> + narenas_limit = mp_.arena_test;
> }
> }
> repeat:;
> diff --git a/malloc/malloc.c b/malloc/malloc.c
> index 6ce76cb4df88930b2bd65e35e4f83bee0c635c27..e121fad35a1a9c4dd6915f1be06d7c6e7df2d1fb 100644
> --- a/malloc/malloc.c
> +++ b/malloc/malloc.c
> @@ -1650,8 +1650,7 @@ static struct malloc_par mp_ =
> .n_mmaps_max = DEFAULT_MMAP_MAX,
> .mmap_threshold = DEFAULT_MMAP_THRESHOLD,
> .trim_threshold = DEFAULT_TRIM_THRESHOLD,
> -#define NARENAS_FROM_NCORES(n) ((n) * (sizeof (long) == 4 ? 2 : 8))
> - .arena_test = NARENAS_FROM_NCORES (1),
> + .arena_test = sizeof (long) == 4 ? 2 : 8,
> .thp_mode = thp_mode_not_supported
> #if USE_TCACHE
> ,
> diff --git a/manual/memory.texi b/manual/memory.texi
> index f8b6be6ee781cafda1774598585b50524d6cdca0..744ea6ac64a52ec512d86c1c7a23733fffd08785 100644
> --- a/manual/memory.texi
> +++ b/manual/memory.texi
> @@ -1388,11 +1388,8 @@ environment variable @env{MALLOC_ARENA_TEST} to the desired value.
> This parameter sets the number of arenas to use regardless of the number of
> cores in the system.
>
> -The default value of this tunable is @code{0}, meaning that the limit on the
> -number of arenas is determined by the number of CPU cores online. For 32-bit
> -systems the limit is twice the number of cores online and on 64-bit systems, it
> -is eight times the number of cores online. Note that the default value is not
> -derived from the default value of M_ARENA_TEST and is computed independently.
> +The default value of this tunable is @code{0}, meaning that the limit is the
> +number of CPU cores online reported by get_nprocs().
>
> This parameter can also be set for the process at startup by setting the
> environment variable @env{MALLOC_ARENA_MAX} to the desired value.
> diff --git a/manual/tunables.texi b/manual/tunables.texi
> index 05f5e65a8901b67301a9d8b1da9369e2e5395e28..e0f141077b133a6b6d5f5f76028e65025c7047b6 100644
> --- a/manual/tunables.texi
> +++ b/manual/tunables.texi
> @@ -220,10 +220,8 @@ identical in features.
> This tunable sets the number of arenas to use in a process regardless of the
> number of cores in the system.
>
> -The default value of this tunable is @code{0}, meaning that the limit on the
> -number of arenas is determined by the number of CPU cores online. For 32-bit
> -systems the limit is twice the number of cores online and on 64-bit systems, it
> -is 8 times the number of cores online.
> +The default value of this tunable is @code{0}, meaning that the limit is the
> +number of CPU cores online reported by get_nprocs().
> @end deftp
>
> @deftp Tunable glibc.malloc.tcache_max
>
More information about the Libc-alpha
mailing list