diff options
author | Jean Boussier <byroot@ruby-lang.org> | 2022-10-19 16:56:37 +0200 |
---|---|---|
committer | Jean Boussier <jean.boussier@gmail.com> | 2023-04-04 19:49:08 +0200 |
commit | ba6ccd871442f55080bffd53e33678c0726787d2 (patch) | |
tree | d8b9435500b80ecdd29e798db76cb4620b5763b7 /process.c | |
parent | a84c99468f26a9f79fec57926d561ed906505eac (diff) |
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.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/7346
Diffstat (limited to 'process.c')
-rw-r--r-- | process.c | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -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)); |