From ba6ccd871442f55080bffd53e33678c0726787d2 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 19 Oct 2022 16:56:37 +0200 Subject: Implement `Process.warmup` [Feature #18885] For now, the optimizations performed are: - Run a major GC - Compact the heap - Promote all surviving objects to oldgen Other optimizations may follow. --- process.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'process.c') diff --git a/process.c b/process.c index daf3456bfd..9605036c64 100644 --- a/process.c +++ b/process.c @@ -115,6 +115,7 @@ int initgroups(const char *, rb_gid_t); #include "ruby/thread.h" #include "ruby/util.h" #include "vm_core.h" +#include "vm_sync.h" #include "ruby/ractor.h" /* define system APIs */ @@ -8510,6 +8511,37 @@ static VALUE rb_mProcUID; static VALUE rb_mProcGID; static VALUE rb_mProcID_Syscall; +/* + * call-seq: + * Process.warmup -> true + * + * Notify the Ruby virtual machine that the boot sequence is finished, + * and that now is a good time to optimize the application. This is useful + * for long running applications. + * + * This method is expected to be called at the end of the application boot. + * If the application is deployed using a pre-forking model, +Process.warmup+ + * should be called in the original process before the first fork. + * + * The actual optimizations performed are entirely implementation specific + * and may change in the future without notice. + * + * On CRuby, +Process.warmup+: + * + * * Perform a major GC. + * * Compacts the heap. + * * Promotes all surviving objects to the old generation. + */ + +static VALUE +proc_warmup(VALUE _) +{ + RB_VM_LOCK_ENTER(); + rb_gc_prepare_heap(); + RB_VM_LOCK_LEAVE(); + return Qtrue; +} + /* * Document-module: Process @@ -8627,6 +8659,8 @@ InitVM_process(void) rb_define_module_function(rb_mProcess, "getpriority", proc_getpriority, 2); rb_define_module_function(rb_mProcess, "setpriority", proc_setpriority, 3); + rb_define_module_function(rb_mProcess, "warmup", proc_warmup, 0); + #ifdef HAVE_GETPRIORITY /* see Process.setpriority */ rb_define_const(rb_mProcess, "PRIO_PROCESS", INT2FIX(PRIO_PROCESS)); -- cgit v1.2.1