Подтвердить что ты не робот

Что означают поля Ruby GC.stat?

Я использую GC.stat для использования памяти памяти в нашем Rails-приложении. GC.stat возвращает хэш со следующими ключами:

:count
:heap_used
:heap_length
:heap_increment
:heap_live_num
:heap_free_num
:heap_final_num

Знает ли кто-нибудь точно, что означают эти значения? Там нет документации о них в источнике Ruby (gc.c), просто комментарий: "Содержимое хэша определяется реализацией и может быть изменено в будущем".

Некоторые из этих полей имеют смысл из контекста, например. count - количество кучи, выделенных Ruby. Но что такое heap_final_num? Что такое heap_increment? Является ли heap_length минимальным размером кучи?

Я играю с RUBY_MIN_HEAP_SLOTS, RUBY_FREE_MIN и RUBY_GC_MALLOC_LIMIT, но изменение этих env vars, похоже, не влияет на :heap_count или :heap_length. Я ожидал бы, что :heap_count снизится, если я резко увеличу минимальные интервалы кучи. Поэтому я действительно хотел бы точно знать, что представляют все значения GC.stat!

Я использую Ruby 1.9.3.

4b9b3361

Ответ 1

:count - количество циклов gc, например. сколько раз gc запускал

:heap_used - количество выделенных кучек, ruby ​​создает по умолчанию одну кучу и увеличивает число кучи, если этого недостаточно для выделения всех объектов

:heap_length - размер кучи. Это первый размер кучи. В идеале у вас должна быть одна куча после script start

:heap_increment - число, которое будет добавлено к последнему размеру кучи, если ruby ​​создаст новую кучу

:heap_live_num - сколько слотов кучи выделено

:heap_free_num - сколько слотов для кучи бесплатное

:heap_final_num - число слотов финализаторов

Вы правы, что, увеличивая RUBY_MIN_HEAP_SLOTS, количество куч должно уменьшаться до единицы. Но чем выше RUBY_FREE_MIN, тем больше кучи вы получите. Он указывает количество свободных слотов, которые должна иметь текущая куча, если это число меньше, чем вы предоставили - рубин создает новую кучу. RUBY_GC_MALLOC_LIMIT больше связан с тем, как часто Ruby запускает GC-процесс и не влияет непосредственно на число кучек. Этот счетчик указывает после того, сколько mallocs ruby ​​запустит GC. Но его можно запустить еще раньше. Обратите внимание, что это не рубиновые obj-распределения, это глобальный рубиновый внутренний счетчик malloc, который увеличивается на любое внутреннее присвоение ruby-интерпретатора.

Ответ 3

Мне кажется, что : count - это число циклов GC 'lazy sweep', а не полных GC циклов на Ruby MRI 1.9.3p448.

Мне пришлось вынудить полный GC до того, как профайлер сообщил о каких-либо событиях GC:

GC::Profiler.enable
GC.start
GC::Profiler.report