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
This commit is contained in:
normal 2018-04-24 20:31:59 +00:00
Родитель 2c8f16e6c0
Коммит acbbf8b0ca
1 изменённых файлов: 11 добавлений и 0 удалений

11
eval.c
Просмотреть файл

@ -20,6 +20,9 @@
#include "mjit.h"
#include "probes.h"
#include "probes_helper.h"
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#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();