У меня есть шесть рабочих 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, который правильно реализует потоковое чтение и запись.