Issue #19435 has been updated by byroot (Jean Boussier).
Do we need the minor/major prefix?
I believe we do. Generally speaking what you really want to reduce is major GC. There are
case where minor GC might trigger too much leading in performance issues (in part because
it end up promoting objects to the old generation too quickly), but for the most part
it's the majors you want to avoid.
Also these names are fairly cryptic, what do they
mean? Probably there should be some docs for that.
Yes, if these are accepted I'll certainly document them in the `GC.stat` method.
I think counting calls to GC.start would be useful
Our initial patch had those but I removed it to limit the number of extra keys, and
because it's not a cause you should see in production, ever, aside from pre-fork
memory optimization etc.
Same if not worse for `GC.stress`. There is 0 reason why it would trigger GC in
production.
----------------------------------------
Feature #19435: Expose counts for each GC reason in GC.stat
https://bugs.ruby-lang.org/issues/19435#change-101848
* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
----------------------------------------
### Context
We recently tuned the GC settings on our monolith application because we were seeing some
very long GC pauses (multiple seconds) during some requests.
Very early we realized that we could know how often the GC was triggered, and how long it
was taking, but we had no information as to why, hence no good way
to know which specific configuration to tune. As of today, the only way to get this
information is to compile Ruby with debug counters, but that's not really
accessible for most users, and not very suitable to be deployed in production.
So we patched our Ruby to expose counters for each specific reason in `GC.stat` and this
data was extremely valuable.
For instance we discovered that the number 1 cause of major GC was `shady` objects, which
allowed us to both better tune or GC and to drive some
targeted patches to Ruby.
### Proposal
We'd like to merge the patch we used on our Ruby build. It expose 8 new keys in
`GC.stat`:
- `:major_gc_nofree_count`
- `:major_gc_oldgen_count`
- `:major_gc_shady_count`
- `:major_gc_newobj_count`
- `:major_gc_malloc_count`
- `:major_gc_oldmalloc_count`
- `:minor_gc_newobj_count`
- `:minor_gc_malloc_count`
Some very uncommon reasons like `force` etc are ignored as they're not valuable.
Also note that sometimes multiple conditions can be met to trigger GC, in such case we my
increment several counters, so the sum of `major_gc_*_count` can be higher than
`major_gc_count`.
Proposed patch:
https://github.com/ruby/ruby/pull/7250
--
https://bugs.ruby-lang.org/