【问题标题】:Unicorn downs for few seconds after USR2 and QUIT signals (Should not)在 USR2 和 QUIT 信号后,独角兽下降了几秒钟(不应该)
【发布时间】:2017-12-01 23:28:48
【问题描述】:

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

独角兽.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 发送给 old 主人。问题就在这里。当老主人收到QUIT时,整个新老主人和孩子都掉了下来,重新创造了。这会使我的系统停机几秒钟。

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

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

我不使用-D 命令。我使用工头生成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 个线程),我将获得真正的“零停机时间”。

【问题讨论】:

    标签: ruby capistrano unicorn


    【解决方案1】:

    这是预期的行为:

    Supervisord 要求 unicorn 进程不进行守护进程。将 SIGUSR2 发送给独角兽也会导致老主人死亡。由于 supervisord 监视旧的 master 这将导致它认为应用程序已退出,即使它正在使用新的进程 ID 运行。 最后 Supervisor 将尝试重新启动应用程序,但由于所有套接字都被新的 unicorn master 使用而失败。

    解决方案:

    1. 使用 -D 选项并在没有 systemd/supervisord 的情况下自行启动您的 unicorn rails 应用程序。然后 USR2 就可以工作了。
    2. 或者使用 unicornherder 作为包装器。这将为您完成工作。无需停机。

    查看链接:Unicorn + Systemd/Supervisord & Zero Downtime = unicornherder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2017-12-15
      • 1970-01-01
      • 2011-01-29
      • 2013-07-01
      • 2014-01-15
      相关资源
      最近更新 更多