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


Answers

Question

У меня около шести рабочих 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] сборщиком мусора, а gc.stat[:count] говорит мне, что также работает сборщик мусора.

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

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

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

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