Utilisez «Reload» au lieu de «redémarrer» pour Unicorn?
Question
Je suis un peu confus à propos de ma stratégie de déploiement ici, lors du déploiement dans quelles circonstances je voudrais envoyer un reload
signal à la licorne? Par exemple, dans mon cas, ce serait comme:
sudo kill -s USR2 `cat /home/deploy/apps/my_app/current/tmp/pids/unicorn.pid`
J'ai déployé mes applications en tuant ce PID, puis en recommençant à la licorne via quelque chose comme:
bundle exec unicorn -c config/unicorn/production.rb -E production -D
Je me demande juste pourquoi je voudrais utiliser Recharger? Puis-je obtenir des performances pour mon déploiement en le faisant?
La solution
Lorsque vous tuez la licorne, vous provoquez des temps d'arrêt, jusqu'à ce que la licorne puisse recommencer. Lorsque vous utilisez le signal USR2, Unicorn commence d'abord de nouveaux travailleurs, puis une fois qu'ils courent, il tue les anciens travailleurs. Il s'agit essentiellement de supprimer la nécessité de "désactiver" la licorne.
Remarque, l'hypothèse est que vous avez le document before_fork
Crochet dans votre configuration de la licorne, afin de gérer le meurtre des anciens travailleurs, si un fichier ".oldbin" était trouvé, contenant le PID de l'ancien processus de la licorne:
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