
Issue #19571 has been updated by peterzhu2118 (Peter Zhu).
ratio to the old objects is acceptable?
Yes, I think using a ratio of old objects will allow it adapt to different situations. If there are very few old objects (e.g. 10k), then it doesn't take very long to run a major GC, so it's ok that the `remembered_wb_unprotected_objects_limit` is lower. But if there are a lot of old objects (e.g. 10M), then it takes a long time to run a major GC, so we should run as little major GC as possible by having a higher `remembered_wb_unprotected_objects_limit`. This will make minor GCs a bit slower, but it's much faster than running a major GC.
how we confirm the 1% is best on default.
The results we got with different values of `RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO` was: 0 < 0.0025 < 0.005 < 0.02 < 0.01 We got the best results with 0.01 and worse results with 0.02 and 0.005. But 0.02 and 0.005 were all better than 0 (which is turned off).
To make analysis, can you logging measurements on each GC?
We log GC information, what kind of information are you looking for?
and could you observe similar benefits on railsbench or other benchmarks?
Benchmarks like railsbench don't generate enough remembered WB unprotected objects to ever trigger a major GC, so this patch made no difference in railsbench.
could you give us details? too many major gc because of it?
To clarify, numbers like 0.005 and 0.02 performed better than 0 (turned off), but 0.01 performed the best. But yes, we run less major GC which is where the significant improvement in p99 response times comes from. We run about 1/3 of the number of major GC with this feature. ---------------------------------------- Feature #19571: Add REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO to the GC https://bugs.ruby-lang.org/issues/19571#change-102809 * Author: peterzhu2118 (Peter Zhu) * Status: Open * Priority: Normal ---------------------------------------- GitHub PR: https://github.com/ruby/ruby/pull/7577 The proposed PR adds the environment variable `RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO` which is used to calculate the `remembered_wb_unprotected_objects_limit` using a ratio of `old_objects`. This should improve performance by reducing major GC because, in a major GC, we mark all of the old objects, so we should have more uncollectible WB unprotected objects before starting a major GC. The default has been set to 0.01 (1% of old objects). On one of [Shopify's highest traffic Ruby apps, Storefront Renderer](https://shopify.engineering/how-shopify-reduced-storefront-response-times-re...), we saw significant improvements after deploying this patch in production. In the graphs below, we have the `tuned` group which uses `RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO=0.01` (the default value), and an `untuned` group, which turns this feature off with `RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO=0`. We see that the tuned group spends significantly less time in GC, on average 0.67x of the time compared to the untuned group and 0.49x for p99. We see this improvement in GC time translate to improvements in response times. The average response time is now 0.96x of the time compared to the untuned group and 0.86x for p99.  ---Files-------------------------------- Screenshot 2023-04-03 at 11.39.06 AM.png (554 KB) -- https://bugs.ruby-lang.org/