Heroku 上有两个实例 运行,但只有 1 个工作人员。为什么?
Two instances running on Heroku but only 1 worker. Why?
我一直在解决 Unicorn 上 Heroku Rails-app 运行ning 上大约 550 Mb 的内存使用问题,这导致大约 2k ms 的响应时间。
我查看了我的 New Relic-graphs 并意识到我正在 运行ning 两个实例,但我只有 1 个工人,而且我只有 运行ning 1 dyno(业余爱好)。我不明白为什么有两个实例!好像我不小心使用了 "ghost" 实例。这只发生在我使用 Unicorn 时,而不是在 Puma 上。
编辑:我添加了一个工人,看看如果我 运行 2 个工人会发生什么。根据 New Relic,这导致 3 个实例 运行ning,因此它不会复制,只是添加一个幽灵实例。
我每 10 分钟一次 运行 一个简短的计划任务,可以在图中看到。 ENV["WEB_CONCURRENCY"]
未设置,顺便说一下。
# Unicorn.rb:
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 1)
timeout 15
preload_app true
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
# Proc
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
运行 heroku ps
给出:
heroku ps
=== web (Hobby): bundle exec unicorn -p $PORT -c ./config/unicorn.rb (1)
web.1: up 2018/01/12 11:34:08 +0100 (~ 5h ago)
这种行为是在预料之中还是我在这里做错了什么?什么会导致第二个实例 运行?是否有可能在启动时不小心在应用程序上启动两个版本?
我删除了调度程序、一些 gem 和 dalli 缓存,这也删除了 extra/ghost 实例。然后我把它们一个接一个地放回去,但它停留在一个实例中。 IE。之前有两个实例的设置完全相同,现在减少到 1(这最有意义)。
内存消耗保持不变,所以我将其标记为 New Relic 错误。不幸的是。
我一直在解决 Unicorn 上 Heroku Rails-app 运行ning 上大约 550 Mb 的内存使用问题,这导致大约 2k ms 的响应时间。
我查看了我的 New Relic-graphs 并意识到我正在 运行ning 两个实例,但我只有 1 个工人,而且我只有 运行ning 1 dyno(业余爱好)。我不明白为什么有两个实例!好像我不小心使用了 "ghost" 实例。这只发生在我使用 Unicorn 时,而不是在 Puma 上。
编辑:我添加了一个工人,看看如果我 运行 2 个工人会发生什么。根据 New Relic,这导致 3 个实例 运行ning,因此它不会复制,只是添加一个幽灵实例。
我每 10 分钟一次 运行 一个简短的计划任务,可以在图中看到。 ENV["WEB_CONCURRENCY"]
未设置,顺便说一下。
# Unicorn.rb:
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 1)
timeout 15
preload_app true
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
# Proc
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
运行 heroku ps
给出:
heroku ps
=== web (Hobby): bundle exec unicorn -p $PORT -c ./config/unicorn.rb (1)
web.1: up 2018/01/12 11:34:08 +0100 (~ 5h ago)
这种行为是在预料之中还是我在这里做错了什么?什么会导致第二个实例 运行?是否有可能在启动时不小心在应用程序上启动两个版本?
我删除了调度程序、一些 gem 和 dalli 缓存,这也删除了 extra/ghost 实例。然后我把它们一个接一个地放回去,但它停留在一个实例中。 IE。之前有两个实例的设置完全相同,现在减少到 1(这最有意义)。
内存消耗保持不变,所以我将其标记为 New Relic 错误。不幸的是。