2012-02-29 17 views
5

Estoy un poco confundido acerca de mi estrategia de implementación aquí, cuando despliego bajo qué circunstancias quisiera enviar una señal reload al unicornio? Por ejemplo, en mi caso sería:Use `reload` en lugar de` restart` para Unicorn?

sudo kill -s USR2 `cat /home/deploy/apps/my_app/current/tmp/pids/unicorn.pid` 

He estado desplegando mis aplicaciones matando pid que, a continuación, iniciar unicornio nuevo a través de algo como:

bundle exec unicorn -c config/unicorn/production.rb -E production -D 

Me pregunto por qué Me gustaría usar recargar? ¿Puedo obtener algún rendimiento para mi implementación al hacerlo?

Respuesta

14

Cuando matas al unicornio, ocasionas tiempo de inactividad, hasta que el unicornio puede volver a comenzar. Cuando usas la señal USR2, el unicornio comienza primero con los nuevos trabajadores, luego, una vez que se ejecutan, mata a los trabajadores mayores. Básicamente se trata de eliminar la necesidad de "apagar" el unicornio.

Nota, se supone que tiene el gancho documentado before_fork en la configuración de su unicornio, para manejar el asesinato de los trabajadores antiguos, si se encuentra un archivo ".oldbin", que contiene 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 
Cuestiones relacionadas