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

Sidekiq не освобождает память после того, как работники закончили

У меня есть шесть рабочих Sidekiq, которые выполняют сканирование JSON. В зависимости от размера набора конечных точек они заканчиваются между 1 и 4 часами. Особенно, наблюдая за длинным, который занимает 4 часа, я вижу очень небольшое увеличение памяти с течением времени.

Это не проблема, пока я не хочу снова планировать те же рабочие задания. Память не освобождается и не складывается, пока я не запустится в Linux OOM Killer, который избавится от моего процесса Sidekiq.

Утечка памяти? Я просмотрел количество разных объектов в ObjectSpace:

ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 }

На самом деле нет увеличения, набор хэшей, массивов и т.д. остается неизменным, короткие сокращения сметятся сборщиком мусора, а gc.stat[:count] говорит мне, что сборщик мусора тоже работает.

Даже после завершения работника, например. Я запустил [Готово], и никакие рабочие не заняты больше, память не освобождается. В чем причины этого? Могу ли я что-то сделать против этого? Напишите финализатор?

Единственное текущее решение: перезапустите процесс Sidekiq.

Я на Ruby 2.0.0 и использую Ruby MRI.


Для анализа JSON я использую Yajl, таким образом, связывание C. Мне это нужно, потому что он кажется единственным быстрым парсером JSON, который правильно реализует потоковое чтение и запись.

4b9b3361

Ответ 1

Майк Перхам, который написал Sidekiq, обратился к этому здесь: http://www.mikeperham.com/2009/05/25/memory-hungry-ruby-daemons/

tl; dr версия:. МРТ не вернет память, тем больше вы можете контролировать кучу, и для этого Ruby Enterprise Edition.

Не знаю, что это помогает, но это ситуация - прямо из устья лошади.