From acbbf8b0cac188bca76e28dc5e345ce4a799f8b0 Mon Sep 17 00:00:00 2001 From: normal Date: Tue, 24 Apr 2018 20:31:59 +0000 Subject: [PATCH] eval.c (ruby_setup): disable THP on Linux Transparent Huge Pages (THP) decrease the effectiveness of CoW-friendly GC because it decreases page granularity. That is, a forked process dirtying one bit of CoW-shared memory can trigger a copy of a huge page (2MB on x86-64) instead of a smaller, standard page (4K). * eval.c (ruby_setup): disable THP on Linux [ruby-core:86651] [Feature #14705] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63253 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/eval.c b/eval.c index 9fa534fb24..6bd9e05f77 100644 --- a/eval.c +++ b/eval.c @@ -20,6 +20,9 @@ #include "mjit.h" #include "probes.h" #include "probes_helper.h" +#ifdef HAVE_SYS_PRCTL_H +#include +#endif NORETURN(void rb_raise_jump(VALUE, VALUE)); @@ -52,6 +55,14 @@ ruby_setup(void) return 0; ruby_init_stack((void *)&state); + + /* + * Disable THP early before mallocs happen because we want this to + * affect as many future pages as possible for CoW-friendliness + */ +#if defined(__linux__) && defined(PR_SET_THP_DISABLE) + prctl(PR_SET_THP_DISABLE, 1, 0, 0, 0); +#endif Init_BareVM(); Init_heap(); Init_vm_objects();