Unicorn полностью игнорирует сигнал USR2

У меня довольно странная проблема с unicorn на рабочем сервере. Хотя в конфигурационном файле preload_app указано true, отправка USR2 главному процессу не генерирует никакого ответа, и кажется, что unicorn вообще игнорирует сигнал. На другом сервере отправка USR2 изменяет главный процесс на и (старое) состояние и успешно запускает новый главный процесс. Проблемный сервер использует RVM и упаковщик, поэтому я предполагаю, что это как-то связано (другой - ванильный рубин). Отправка сигналов, отличных от USR2 (QUIT, HUP), работает нормально. Есть ли способ проследить, что здесь происходит за кулисами? Лог-файл Unicorn полностью пуст.


person Ehud    schedule 06.07.2011    source источник
comment
Вас может заинтересовать strace. Я не знаю, доступен ли он для OSX, однако он поможет вам разобраться в этом. linux.die.net/man/1/strace   -  person Devin M    schedule 06.07.2011


Ответы (3)


Я подозреваю, что ваша проблема может заключаться в том, что ваш Gemfile изменился, но вы не запустили своего единорога таким образом, чтобы USR2 мог использовать новый Gemfile. Поэтому происходит сбой при попытке перезапустить приложение.

Проверьте свой /log/unicorn.log, чтобы узнать, что может быть неисправно.

Если вы используете Capistrano, укажите BUNDLE_GEMFILE в качестве символической ссылки, например:

run "cd #{current_path} && BUNDLE_GEMFILE=#{current_path}/Gemfile bundle exec unicorn -c #{config_path} -E #{unicorn_env} -D"

Вот PR, демонстрирующий это.

person iHiD    schedule 15.05.2013
comment
Я всегда забываю об этом при развертывании нового единорога. before_exec { |server| ENV["BUNDLE_GEMFILE"] = "#{app_path}/current/Gemfile" } - person Adam; 06.01.2014

У меня возникла похожая проблема, но мои журналы четко определили проблему: отправка USR2 изначально работала на развертываниях, но по мере очистки развертываний выпуск, на котором изначально был запущен мастер Unicorn, удалялся, поэтому попытки отправки сигнала USR2 казалось бы, ничего не делает / терпит неудачу, с журналом ошибок, указывающим:

повторное выполнение разветвленного дочернего элемента... 53 exec': Нет такого файла или каталога - /var/www/application/releases/153565b36021c0b8c9cbab1cc373a9c5199073db/vendor/bundle/ruby/1.9.1/bin/unicorn (Errno::ENOENT)

В документах Unicorn эта потенциальная проблема упоминается по адресу http://unicorn.bogomips.org/Sandbox.html. : «очистка старых ревизий приведет к тому, что установки unicorn для конкретной ревизии пропадут, а обновления завершатся сбоем», что в моем случае означало, что USR2 «ничего не делает».

Я использую рецепт приложения Chef для развертывания приложений, который создает символическую ссылку на каталог vendor_bundle, который является общим для всех развертываний, но вызов bundle exec unicorn по-прежнему приводил к тому, что исходный мастер Unicorn содержал ссылку на путь, которая включала конкретный каталог выпуска.

Чтобы исправить это, мне пришлось вызвать bundle exec /var/www/application/shared/vendor_bundle/ruby/1.9.1/bin/unicorn, чтобы убедиться, что у мастера Unicorn есть путь к двоичному файлу, который будет действителен от одного развертывания к другому. Как только это было сделано, я мог развернуться к своему сердцу, и kill -USR2 PID будет работать, как рекламируется.

В документах Unicorn упоминается, что вы можете вручную изменить ссылку на двоичный путь, установив следующее в файле конфигурации Unicorn и отправив HUP для перезагрузки Unicorn перед отправкой USR2 для разветвления нового мастера: Unicorn::HttpServer::START_CTX[0] = "/some/path/to/bin/unicorn"

Возможно, это полезно для некоторых людей в подобных ситуациях, но я не реализовал это, так как оказалось достаточно указать абсолютный путь к общему бинарному файлу unicorn.

person justsee    schedule 20.07.2012

Я столкнулся с подобной проблемой на своем VDS. Strace'ing выявил причину:

write(2, "E, [2011-07-23T04:40:27.240227 #19450] ERROR -- : Cannot allocate memory - fork(2) (Errno::ENOMEM) <...>

Попробуйте увеличить объем памяти, ограничения памяти XEN по запросу (в моем случае они были слишком жесткими) или, возможно, включите overcommit, поскольку последний может иметь серьезные нежелательные побочные эффекты, поэтому делайте это осторожно.

person whitequark    schedule 23.07.2011