Используйте `reload` вместо` restart` для Unicorn? - PullRequest
5 голосов
/ 29 февраля 2012

Меня немного смущает моя стратегия развертывания, когда при развертывании при каких обстоятельствах я хотел бы отправить сигнал reload единорогу? Например, в моем случае это будет выглядеть так:

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

Я развертывал свои приложения, убив этот pid, затем снова запустив единорога с помощью чего-то вроде:

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

Мне просто интересно, почему я хочу использовать перезагрузку? Можно ли таким образом повысить производительность своего развертывания?

1 Ответ

14 голосов
/ 29 февраля 2012

Когда вы убиваете единорога, вы вызываете простои, пока единорог не сможет снова начать работу. Когда вы используете сигнал USR2, единорог сначала запускает новых работников, а затем, когда они бегут, убивает старых работников. В основном это все о том, чтобы избавиться от необходимости «выключать» единорога.

Обратите внимание, что предполагается, что у вас есть документированный хук before_fork в вашей конфигурации единорога, чтобы справиться с убийством старых рабочих, если будет найден файл ".oldbin", содержащий PID старого единорога процесс:

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
...