summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <byroot@ruby-lang.org>2023-09-15 16:22:09 +0200
committerJean Boussier <jean.boussier@gmail.com>2023-09-15 17:45:21 +0200
commitefe2822708d62bfe3ba858da526e6ef7d4724959 (patch)
treecafd2cc6bdbd6653a8fe1926911f1cd9c16e3a27
parent28fe88468d7bde129221415bfa874f4b70bf6843 (diff)
Process.warmup: invoke `malloc_trim` if available
Similar to releasing free GC pages, releasing free malloc pages reduce the amount of page faults post fork.
-rw-r--r--configure.ac1
-rw-r--r--gc.c4
-rw-r--r--process.c1
3 files changed, 6 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index 30a1350fa6..70400dd797 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2078,6 +2078,7 @@ AC_CHECK_FUNCS(lstat)
AC_CHECK_FUNCS(lutimes)
AC_CHECK_FUNCS(malloc_usable_size)
AC_CHECK_FUNCS(malloc_size)
+AC_CHECK_FUNCS(malloc_trim)
AC_CHECK_FUNCS(mblen)
AC_CHECK_FUNCS(memalign)
AC_CHECK_FUNCS(memset_s)
diff --git a/gc.c b/gc.c
index 3fd2a3b33f..662ddc3e0f 100644
--- a/gc.c
+++ b/gc.c
@@ -9740,6 +9740,10 @@ rb_gc_prepare_heap(void)
rb_objspace_each_objects(gc_set_candidate_object_i, NULL);
gc_start_internal(NULL, Qtrue, Qtrue, Qtrue, Qtrue, Qtrue);
free_empty_pages();
+
+#if defined(HAVE_MALLOC_TRIM) && !defined(RUBY_ALTERNATIVE_MALLOC_HEADER)
+ malloc_trim(0);
+#endif
}
static int
diff --git a/process.c b/process.c
index d7e04830ee..690872ad36 100644
--- a/process.c
+++ b/process.c
@@ -8789,6 +8789,7 @@ static VALUE rb_mProcID_Syscall;
* * Precomputes the coderange of all strings.
* * Frees all empty heap pages and increments the allocatable pages counter
* by the number of pages freed.
+ * * Invoke +malloc_trim+ if available to free empty malloc pages.
*/
static VALUE