[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