ruby - Sidekiq no desasigna la memoria después de que los trabajadores hayan terminado
memory-management memory-leaks (1)
Mike Perham, que escribió Sidekiq, abordó esto aquí: http://www.mikeperham.com/2009/05/25/memory-hungry-ruby-daemons/
tl; versión dr: la resonancia magnética no devolverá la memoria, lo máximo que puede hacer es controlar el montón, y para hacer eso, se sugirió Ruby Enterprise Edition .
No sé si algo de esto ayuda, pero esa es la situación, directamente desde la boca del caballo.
Tengo alrededor de seis trabajadores de Sidekiq que realizan rastreo de JSON . Dependiendo del tamaño del conjunto de datos del punto final, terminan entre 1min y 4h. Especialmente, viendo el largo, que toma 4 horas, veo un ligero aumento de la memoria con el tiempo.
No es un problema, hasta que quiera programar los mismos trabajos de los trabajadores nuevamente. La memoria no se desasigna y se acumula, hasta que me encuentro con el OOM Killer de Linux que se deshace de mi proceso Sidekiq.
¿ Fuga de memoria ? Observé la cantidad de objetos diferentes en ObjectSpace:
ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 }
No hay realmente un aumento allí, el conjunto de hash, matrices, etc. permanece igual, el Garbage Collector gc.stat[:count]
incrementos cortos y gc.stat[:count]
me dice que el Recolector de basura también está funcionando.
Incluso después de que el trabajador termina, por ejemplo, obtengo el [Hecho] registrado y no hay más trabajadores ocupados, la memoria no está desasignada. ¿Cuáles son las razones para eso? ¿Puedo hacer algo en contra de esto? Escribir un finalizador?
La única solución actual : reinicie el proceso Sidekiq.
Estoy en Ruby 2.0.0 y uso Ruby MRI.
Para el análisis JSON utilizo Yajl , por lo tanto un enlace C. Lo necesito porque parece ser el único analizador rápido de JSON que implementa correctamente la lectura y la escritura en tiempo real.