[PATCH] malloc: Reduce maximum arenas

Wilco Dijkstra Wilco.Dijkstra@arm.com
Thu Apr 2 15:05:43 GMT 2026


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?

---

diff --git a/malloc/arena.c b/malloc/arena.c
index ddde32c7121257b4140c902f40971385411bab52..1b73f74a021f5fd843c0ddf09568a75f67824e29 100644
--- a/malloc/arena.c
+++ b/malloc/arena.c
@@ -813,16 +813,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 6a888b0eb7de53ae7b814275e86d2bd2f06b5e53..48fb368b245833ec10bed4234946ad8cc57d7bfc 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1812,8 +1812,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 = malloc_thp_mode_not_supported
 #if USE_TCACHE
   ,
diff --git a/manual/memory.texi b/manual/memory.texi
index 4f0ef51514057136c14ceb6811face0117e69272..35ebe499287035d1dd4bf900debfc7b251ef747a 100644
--- a/manual/memory.texi
+++ b/manual/memory.texi
@@ -1384,8 +1384,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.
@@ -1395,10 +1394,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.
 
 This parameter can also be set for the process at startup by setting the
 environment variable @env{MALLOC_ARENA_MAX} to the desired value.



More information about the Libc-alpha mailing list