弊ぼっちのRubyさんです
~ $ ruby --version
ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-linux]
~ $ ruby -e 'puts GC.stat'
{:count=>5, :time=>7, :heap_allocated_pages=>30, :heap_sorted_length=>205, :heap_allocatable_pages=>175, :heap_available_slots=>30488, :heap_live_slots=>28320, :heap_free_slots=>2168, :heap_final_slots=>0, :heap_marked_slots=>15896, :heap_eden_pages=>30, :heap_tomb_pages=>0, :total_allocated_pages=>30, :total_freed_pages=>0, :total_allocated_objects=>67816, :total_freed_objects=>39496, :malloc_increase_bytes=>411392, :malloc_increase_bytes_limit=>16777216, :minor_gc_count=>3, :major_gc_count=>2, :compact_count=>0, :read_barrier_faults=>0, :total_moved_objects=>0, :remembered_wb_unprotected_objects=>182, :remembered_wb_unprotected_objects_limit=>274, :old_objects=>15253, :old_objects_limit=>25350, :oldmalloc_increase_bytes=>501376, :oldmalloc_increase_bytes_limit=>16777216}
man rubyによるとフルGCを走らせるのは old objectの数が、RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR環境変数 × 前回のフルGC後のold objectの数を越えた時で、デフォルトは2.0。前回…。
他に、RUBY_GC_OLDMALLOC_LIMITとRUBY_GC_OLDMALLOC_LIMIT_MAXもfull GCのトリガに関係しているみたい。
https://github.com/ruby/ruby/blob/78fcc9847a9db6d42c8c263154ec05903a370b6b/test/ruby/test_gc.rb#L306 に環境変数の設定値の例があるけれどランタイム側でデフォルト値を設定している場所は見つけられないな…
./gc.c にあった。GitHubの検索では見つからないのかしら。
とりあえずfull GCを始める時にログを書いてほしいなと思ったんだけどRGENGC_DEBUG関連はコンパイル時に設定されてるみたいだ。時々弊ぼっちがのっそりするのはfull GCのせいだと仮定して話を進めるね。
gc.cよりデフォルトはたぶん下記(OLDMALLOC_LIMITのデフォルトは〜_MINとして書かれている)。
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR 2.0
RUBY_GC_OLDMALLOC_LIMIT 16 * 1024 * 1024
RUBY_GC_OLDMALLOC_LIMIT_MAX 128 * 1024 * 1024
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTORとRUBY_GC_OLDMALLOC_LIMITを2倍にしてみようかな。とりゃ。
$ heroku config:set RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=4.0 RUBY_GC_OLDMALLOC_LIMIT=33554432
とりあえずPumaさんは起動してきてくれた。
Sidekiqさんも無事に起動。これでしばらく様子見だね。
一晩置いたけどまだもっさりしてない(Libratoさんからしきい値警告のメールをもらってない)。Full GC減らす方向にパラメータを変えてみたの良かったのかも。