I wrote:
> For tracking GC statistics, we should probably keep them in
> rb_execution_context_t instead of current globals using atomics.
> To recover the most memory from GC, we want to do gc_mark_roots

That's maybe too complex for now, this patch (on top of existing
sleepy GC):

https://80x24.org/spew/20180514201509.28069-1-e / 80x24.org/raw

While the effect on big Rails apps seems minimal, I think the
significant improvements for small scripts is still helpful and
we can build on top of them.  I am already satisfied with the
improvement from a Net::HTTP example from the first patch:

https://80x24.org/spew/20180501080844.22751-3-e / 80x24.org/raw

Since all new behavior changes can be easily disabled via gc.h,
I propose we commit the current changes to trunk for now to
gain more testing and feedback.


Current series is up to 8 patches, but I will squash
"thread_sync.c (mutex_lock): add missing else" into
"thread.c: native_sleep callers may perform GC".

The following changes since commit 6f0de6ed98e669e915455569fb4dae9022cb47b8:

  error.c: check redefined backtrace result (2018-05-14 08:33:14 +0000)

are available in the Git repository at:

  git://80x24.org/ruby.git sleepy-gc-v6

for you to fetch changes up to 6944014696bea793603d47db6dba0a1e83f1e430:

  gc.c: enter sleepy GC start (2018-05-14 20:25:29 +0000)

----------------------------------------------------------------
Eric Wong (8):
      thread.c (timeout_prepare): common function
      gc: rb_wait_for_single_fd performs GC if idle (Linux)
      thread.c (do_select): perform GC if idle
      thread.c: native_sleep callers may perform GC
      thread_sync.c (mutex_lock): add missing else
      benchmark: add benchmarks for sleepy GC
      gc.c: allow disabling sleepy GC
      gc.c: enter sleepy GC start

 benchmark/bm_vm3_gc_io_select.rb        |  30 +++++
 benchmark/bm_vm3_gc_io_wait.rb          |  21 ++++
 benchmark/bm_vm3_gc_join_timeout.rb     |  11 ++
 benchmark/bm_vm3_gc_remote_free_spmc.rb |  15 +++
 benchmark/bm_vm3_gc_szqueue.rb          |  14 +++
 gc.c                                    |  55 +++++++++
 gc.h                                    |  28 +++++
 thread.c                                | 197 +++++++++++++++++++++-----------
 thread_pthread.c                        |   6 +
 thread_sync.c                           |  21 +++-
 thread_win32.c                          |   6 +
 11 files changed, 337 insertions(+), 67 deletions(-)
 create mode 100644 benchmark/bm_vm3_gc_io_select.rb
 create mode 100644 benchmark/bm_vm3_gc_io_wait.rb
 create mode 100644 benchmark/bm_vm3_gc_join_timeout.rb
 create mode 100644 benchmark/bm_vm3_gc_remote_free_spmc.rb
 create mode 100644 benchmark/bm_vm3_gc_szqueue.rb

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>