gpt4 book ai didi

ruby-on-rails - 使用 capistrano 部署 "zero downtime"后, unicorn worker 超时

转载 作者:行者123 更新时间:2023-12-04 15:21:33 25 4
gpt4 key购买 nike

我正在运行 Rails 3.2.21 应用程序并使用 capistrano(nginx 和 unicorn)部署到 Ubuntu 12.04.5 机器。

我的应用程序设置为零停机部署(至少我认为),我的配置文件看起来或多或少像 these .

问题来了:当部署接近完成并重新启动 unicorn 时,当我查看我的 unicorn.log 时,我看到它启动了新 worker ,收获了旧 worker ……但是我的应用程序只挂了 2-3 分钟。此时对应用程序的任何请求都会达到超时窗口(我设置为 40 秒)并返回我的应用程序的 500 错误页面。

这是 输出的第一部分unicorn.log 随着 unicorn 重新启动(我有 5 个 unicorn worker ):

I, [2015-04-21T23:06:57.022492 #14347]  INFO -- : master process ready
I, [2015-04-21T23:06:57.844273 #15378] INFO -- : worker=0 ready
I, [2015-04-21T23:06:57.944080 #15381] INFO -- : worker=1 ready
I, [2015-04-21T23:06:58.089655 #15390] INFO -- : worker=2 ready
I, [2015-04-21T23:06:58.230554 #14541] INFO -- : reaped #<Process::Status: pid 15551 exit 0> worker=4
I, [2015-04-21T23:06:58.231455 #14541] INFO -- : reaped #<Process::Status: pid 3644 exit 0> worker=0
I, [2015-04-21T23:06:58.249110 #15393] INFO -- : worker=3 ready
I, [2015-04-21T23:06:58.650007 #15396] INFO -- : worker=4 ready
I, [2015-04-21T23:07:01.246981 #14541] INFO -- : reaped #<Process::Status: pid 32645 exit 0> worker=1
I, [2015-04-21T23:07:01.561786 #14541] INFO -- : reaped #<Process::Status: pid 15534 exit 0> worker=2
I, [2015-04-21T23:07:06.657913 #14541] INFO -- : reaped #<Process::Status: pid 16821 exit 0> worker=3
I, [2015-04-21T23:07:06.658325 #14541] INFO -- : master complete

之后,当应用程序挂起 2-3 分钟时,发生了以下情况:
E, [2015-04-21T23:07:38.069635 #14347] ERROR -- : worker=0 PID:15378 timeout (41s > 40s), killing
E, [2015-04-21T23:07:38.243005 #14347] ERROR -- : reaped #<Process::Status: pid 15378 SIGKILL (signal 9)> worker=0
E, [2015-04-21T23:07:39.647717 #14347] ERROR -- : worker=3 PID:15393 timeout (41s > 40s), killing
E, [2015-04-21T23:07:39.890543 #14347] ERROR -- : reaped #<Process::Status: pid 15393 SIGKILL (signal 9)> worker=3
I, [2015-04-21T23:07:40.727755 #16002] INFO -- : worker=0 ready
I, [2015-04-21T23:07:43.212395 #16022] INFO -- : worker=3 ready
E, [2015-04-21T23:08:24.511967 #14347] ERROR -- : worker=3 PID:16022 timeout (41s > 40s), killing
E, [2015-04-21T23:08:24.718512 #14347] ERROR -- : reaped #<Process::Status: pid 16022 SIGKILL (signal 9)> worker=3
I, [2015-04-21T23:08:28.010429 #16234] INFO -- : worker=3 ready

最终,在 2 或 3 分钟后,应用程序再次开始响应,但一切都更加缓慢。你可以在 New Relic 中非常清楚地看到这一点(水平线表示部署,浅蓝色区域表示 Ruby):

New Relic graph during and after deploy

我有一个相同的登台服务器,我无法在登台中复制这个问题......当然,登台没有负载(我是唯一一个尝试发出页面请求的人)。

这是我的 配置/unicorn.rb 文件:
root = "/home/deployer/apps/myawesomeapp/current"
working_directory root

pid "#{root}/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.log"
stdout_path "#{root}/log/unicorn.log"

shared_path = "/home/deployer/apps/myawesomeapp/shared"

listen "/tmp/unicorn.myawesomeapp.sock"
worker_processes 5
timeout 40

preload_app true

before_exec do |server|
ENV['BUNDLE_GEMFILE'] = "#{root}/Gemfile"
end

before_fork do |server, worker|
if defined?(ActiveRecord::Base)
ActiveRecord::Base.connection.disconnect!
end

old_pid = "#{root}/tmp/pids/unicorn.pid.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH

end
end
end

after_fork do |server, worker|
if defined?(ActiveRecord::Base)
ActiveRecord::Base.establish_connection
end
end

只是为了画一幅完整的图画,在我的 capistrano deploy.rb , unicorn 重启任务如下所示:
namespace :deploy do
task :restart, roles: :app, except: { no_release: true } do
run "kill -s USR2 `cat #{release_path}/tmp/pids/unicorn.pid`"
end
end

任何想法为什么 unicorn worker 在部署后立即超时?我认为零停机时间的重点是保留旧的,直到新的启动并准备好服务?

谢谢!

更新

我又做了一次部署,这次关注了 生产日志看看那里发生了什么。唯一可疑的是以下几行,它们与正常请求混合在一起:
Dalli/SASL authenticating as 7510de
Dalli/SASL: 7510de
Dalli/SASL authenticating as 7510de
Dalli/SASL: 7510de
Dalli/SASL authenticating as 7510de
Dalli/SASL: 7510de

更新 #2

正如下面的一些答案所建议的那样,我更改了 before_fork阻止添加 sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU所以 worker 会逐渐被杀死。

相同的结果,非常缓慢的部署,具有我在上图中说明的相同尖峰。仅作为上下文,在我的 5 个工作进程中,前 4 个发送了 TTOU 信号,第 5 个发送了 QUIT。尽管如此,似乎并没有什么不同。

最佳答案

我最近在尝试在 Digital Ocean 上设置 Rails/Nginx/Unicorn 时遇到了类似的问题。在调整了一些东西后,我能够让零停机时间部署工作。这里有几件事情可以尝试:

  • 减少工作进程的数量。
  • 增加服务器的内存。我在 512MB RAM 上遇到超时。当我将它增加到 1GB 时似乎解决了这个问题。
  • 使用“capistrano3-unicorn” gem 。
  • 如果 preload_app 为真,则使用重启 (USR2)。如果为 false,则使用重新加载 (HUP)。
  • 确保“tmp/pids”在deploy.rb 中作为linked_dirs 在集合中。
  • 使用 px aux | grep unicorn以确保删除旧进程。
  • 使用 kill [pid]手动停止任何仍在运行的 unicorn 进程。

  • 这是我的 unicorn 配置以供引用:
    working_directory '/var/www/yourapp/current'
    pid '/var/www/yourapp/current/tmp/pids/unicorn.pid'
    stderr_path '/var/www/yourapp/log/unicorn.log'
    stdout_path '/var/www/yourapp/log/unicorn.log'
    listen '/tmp/unicorn.yourapp.sock'
    worker_processes 2
    timeout 30
    preload_app true

    before_fork do |server, worker|
    old_pid = "/var/www/yourapp/current/tmp/pids/unicorn.pid.oldbin"
    if old_pid != server.pid
    begin
    sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
    Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
    end
    end

    部署文件
    lock '3.4.0'

    set :application, 'yourapp'
    set :repo_url, 'git@bitbucket.org:username/yourapp.git'
    set :deploy_to, '/var/www/yourapp'
    set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml', 'config/application.yml')
    set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
    set :format, :pretty
    set :log_level, :info
    set :rbenv_ruby, '2.1.3'

    namespace :deploy do
    after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
    end
    end
    end

    after 'deploy:publishing', 'deploy:restart'
    namespace :deploy do
    task :restart do
    #invoke 'unicorn:reload'
    invoke 'unicorn:restart'
    end
    end

    关于ruby-on-rails - 使用 capistrano 部署 "zero downtime"后, unicorn worker 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29804592/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com