[PATCH v3] malloc: Reduce maximum arenas
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Thu Jun 4 12:45:20 GMT 2026
On 04/06/26 07:40, Wilco Dijkstra wrote:
> v3: Update tunables too
>
> 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.
Maybe keep the bound value of 2 for 32-bits. The rest look ok, just a small
suggestion on documentation.
>
> Passes regress, OK for commit?
>
> ---
>
> 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..f0e17443fb2d34a2e2dec75d99ba771b8d4e8397 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 = 8,
> .thp_mode = thp_mode_not_supported
> #if USE_TCACHE
> ,
> diff --git a/manual/memory.texi b/manual/memory.texi
> index f8b6be6ee781cafda1774598585b50524d6cdca0..818d7837833b377f439409074f6563a20e4553f9 100644
> --- a/manual/memory.texi
> +++ b/manual/memory.texi
> @@ -1378,8 +1378,7 @@ This parameter specifies the number of arenas that can be created before the
> test on the limit to the number of arenas is conducted. The value is ignored if
> @code{M_ARENA_MAX} is set.
>
> -The default value of this parameter is 2 on 32-bit systems and 8 on 64-bit
> -systems.
> +The default value of this parameter is 8.
>
> This parameter can also be set for the process at startup by setting the
> environment variable @env{MALLOC_ARENA_TEST} to the desired value.
> @@ -1389,10 +1388,9 @@ 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.
> +number of arenas is determined by the number of CPU cores online. The limit is
> +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.
Maybe add the number of core online is calculates as if get_nprocs() is called.
>
> 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..c245e31866965a8e090dde1f9f60fe76c0595271 100644
> --- a/manual/tunables.texi
> +++ b/manual/tunables.texi
> @@ -221,9 +221,7 @@ 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.
> +number of arenas is the number of CPU cores online.
> @end deftp
>
> @deftp Tunable glibc.malloc.tcache_max
>
More information about the Libc-alpha
mailing list