[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