在USR2和QUIT信号之后,Unicorn下降几秒钟(不应该)

时间:2017-06-28 14:20:13

标签: ruby capistrano unicorn

我有一个非常基本的应用程序与独角兽。 Rails 5.1应用程序简单地回声/打印" Hello World"。对于测试,我给了4名工人。

unicorn.rb:

worker_processes 4
preload_app true

timeout 30
listen '127.0.0.1:3000', :tcp_nopush => true, :backlog => 4096
# Logging
...

现在,我向主进程发送USR2信号。主过程成功接收到我的信号并创建了另一个主人,然后将其标记为" "并将PID写入oldbin文件

问题从这里开始。当我确保创建了第二个主人和他们的孩子时,我将QUIT发送给主人。问题就在这里。当老主人收到QUIT时,整个新旧主人和孩子都会掉线并重新创建。这使我的系统停机几秒钟。

基本上,新主人自杀然后重新创建。为什么?我在这做错了什么?我认为这是零停机时间。我可以向你保证我有3-5秒的停机时间。

我检查过,老主人用PID 5(例如)创建新主人,他们的孩子为6,7,8,9。当我退出旧主人时,新主人变为10,工人变为11,12 ,13,14。只是表明旧的和新的都退出并重新重新 - 创建。

我不使用-D命令。我使用foreman生成systemd文件,这就是它的样子:

[Unit]
PartOf=bp-web.target

[Service]
User=Pratha
WorkingDirectory=/var/www/app/releases/20170628140005
Environment=PORT=%i
ExecStart=/bin/bash -lc 'exec bundle exec unicorn -E production -c config/unicorn.rb'
Restart=always
StandardInput=null
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=%n
KillMode=mixed
TimeoutStopSec=5
  1. 我使用capistrano进行发布周期和部署。
  2. 如果我使用puma与线程(即使是16个工作人员50个线程),我会得到真正的"零停机时间"。

1 个答案:

答案 0 :(得分:1)

这是预期的行为:

  

Supervisord要求独角兽进程不要守护进程。同时向独角兽发送SIGUSR2会导致旧主人死亡。由于 supervisord观看旧主人 ,这将导致它将应用程序视为已退出,即使它正在使用新的进程ID运行。 最后,Supervisor将尝试重新启动应用程序,但由于新的独角兽大师正在使用所有套接字,因此无法执行此操作。

解决方案:

  1. 使用-D选项并在没有systemd / supervisord的情况下自己启动unicorn rails app。然后USR2将起作用。
  2. 或者使用unicornherder作为包装。这将为您完成这项工作。没有停机时间。
  3. 请参阅链接:Unicorn + Systemd/Supervisord & Zero Downtime = unicornherder