summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorJean Boussier <byroot@ruby-lang.org>2023-02-03 09:46:14 +0100
committerJean Boussier <jean.boussier@gmail.com>2023-02-08 09:26:07 +0100
commit3ab34551450c7a3a3e1ae0b24bf6b78d26129dfa (patch)
tree274efe5d1465b8d65866002f1c74f7cb59a08b04 /gc.c
parent6e7990144f37850b9b3ec871956890e2aa29ad6d (diff)
Add RUBY_GC_HEAP_INIT_SIZE_%d_SLOTS to pre-init pools granularly
The old RUBY_GC_HEAP_INIT_SLOTS isn't really usable anymore as it initalize all the pools by the same factor, but it's unlikely that pools will need similar sizes. In production our 40B pool is 5 to 6 times bigger than our 80B pool.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7235
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/gc.c b/gc.c
index cf87a74bdb..ef25a2d40c 100644
--- a/gc.c
+++ b/gc.c
@@ -11749,15 +11749,28 @@ get_envparam_double(const char *name, double *default_value, double lower_bound,
}
static void
-gc_set_initial_pages(rb_objspace_t *objspace)
+gc_set_initial_pages(rb_objspace_t *objspace, int global_heap_init_slots)
{
gc_rest(objspace);
for (int i = 0; i < SIZE_POOL_COUNT; i++) {
rb_size_pool_t *size_pool = &size_pools[i];
+ char env_key[sizeof("RUBY_GC_HEAP_INIT_SIZE_" "_SLOTS") + DECIMAL_SIZE_OF_BITS(sizeof(size_pool->slot_size) * CHAR_BIT)];
+ snprintf(env_key, sizeof(env_key), "RUBY_GC_HEAP_INIT_SIZE_%d_SLOTS", size_pool->slot_size);
- if (gc_params.heap_init_slots > size_pool->eden_heap.total_slots) {
- size_t slots = gc_params.heap_init_slots - size_pool->eden_heap.total_slots;
+ size_t pool_init_slots = 0;
+ if (!get_envparam_size(env_key, &pool_init_slots, 0)) {
+ if (global_heap_init_slots) {
+ // If we use the global init slot we ponderate it by slot size
+ pool_init_slots = gc_params.heap_init_slots / (size_pool->slot_size / BASE_SLOT_SIZE);
+ }
+ else {
+ continue;
+ }
+ }
+
+ if (pool_init_slots > size_pool->eden_heap.total_slots) {
+ size_t slots = pool_init_slots - size_pool->eden_heap.total_slots;
int multiple = size_pool->slot_size / BASE_SLOT_SIZE;
size_pool->allocatable_pages = slots * multiple / HEAP_PAGE_OBJ_LIMIT;
}
@@ -11823,7 +11836,10 @@ ruby_gc_set_params(void)
/* RUBY_GC_HEAP_INIT_SLOTS */
if (get_envparam_size("RUBY_GC_HEAP_INIT_SLOTS", &gc_params.heap_init_slots, 0)) {
- gc_set_initial_pages(objspace);
+ gc_set_initial_pages(objspace, TRUE);
+ }
+ else {
+ gc_set_initial_pages(objspace, FALSE);
}
get_envparam_double("RUBY_GC_HEAP_GROWTH_FACTOR", &gc_params.growth_factor, 1.0, 0.0, FALSE);