Verwenden Sie 'reload' anstelle von 'restart' für Einhorn?
Frage
Ich bin ein wenig verwirrt über meine Bereitstellungsstrategie hier. Bei der Bereitstellung unter welchen Umständen möchte ich eine senden reload
signal an Einhorn?Zum Beispiel wäre es in meinem Fall so:
sudo kill -s USR2 `cat /home/deploy/apps/my_app/current/tmp/pids/unicorn.pid`
Ich habe meine Apps bereitgestellt, indem ich diese PID beendet und dann Unicorn über so etwas wie neu gestartet habe:
bundle exec unicorn -c config/unicorn/production.rb -E production -D
Ich frage mich nur, warum ich reload verwenden möchte?Kann ich dadurch Leistung für meine Bereitstellung gewinnen?
Lösung
Wenn du Einhorn tötest, verursachst du Ausfallzeiten, bis Einhorn wieder starten kann.Wenn Sie das USR2-Signal verwenden, startet Unicorn zuerst neue Arbeiter, und sobald sie ausgeführt werden, werden die alten Arbeiter getötet.Im Grunde geht es darum, die Notwendigkeit zu beseitigen, Einhorn "auszuschalten".
Beachten Sie, dass davon ausgegangen wird, dass Sie das Dokumentierte haben before_fork
haken Sie Ihre Einhornkonfiguration ein, um das Töten der alten Arbeiter zu bewältigen, sollte ein ".oldbin" -Datei gefunden werden, die die PID des alten Unicorn-Prozesses enthält:
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