¿Usar `recargar` en lugar de `reiniciar` para Unicorn?
Pregunta
Estoy un poco confundido acerca de mi estrategia de implementación aquí, al implementar, ¿bajo qué circunstancias querría enviar un reload
¿señal al unicornio?Por ejemplo en mi caso sería como:
sudo kill -s USR2 `cat /home/deploy/apps/my_app/current/tmp/pids/unicorn.pid`
He estado implementando mis aplicaciones eliminando ese pid y luego iniciando Unicorn nuevamente mediante algo como:
bundle exec unicorn -c config/unicorn/production.rb -E production -D
Me pregunto por qué querría usar la recarga.¿Puedo obtener algún rendimiento para mi implementación al hacerlo?
Solución
Cuando matas a un unicornio, provocas un tiempo de inactividad, hasta que el unicornio pueda volver a funcionar.Cuando usas la señal USR2, Unicorn inicia nuevos trabajadores primero, luego, una vez que se están ejecutando, mata a los trabajadores antiguos.Básicamente se trata de eliminar la necesidad de "apagar" el unicornio.
Tenga en cuenta que se supone que tiene la documentación before_fork
enganche en su configuración de unicornio, para poder manejar la eliminación de los trabajadores antiguos, debe encontrarse un archivo ".oldbin" que contenga el PID del antiguo proceso de unicornio:
before_fork do |server, worker|
# a .oldbin file exists if unicorn was gracefully restarted with a USR2 signal
# we should terminate the old process now that we're up and running
old_pid = "#{pids_dir}/unicorn.pid.oldbin"
if File.exists?(old_pid)
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end