ruby memory-management memory-leaks out-of-memory sidekiq

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.