Что означают поля 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.
Ответы
Ответ 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-интерпретатора.
Ответ 2
Правильное имя переменной среды RUBY_HEAP_MIN_SLOTS
.
https://github.com/ruby/ruby/blob/v1_9_3_194/gc.c#L441
Ответ 3
Мне кажется, что : count - это число циклов GC 'lazy sweep', а не полных GC циклов на Ruby MRI 1.9.3p448.
Мне пришлось вынудить полный GC до того, как профайлер сообщил о каких-либо событиях GC:
GC::Profiler.enable
GC.start
GC::Profiler.report