两个实例在Heroku上运行,但只有一个工作者。为什么?

时间:2018-01-12 16:29:54

标签: ruby-on-rails heroku memory-leaks unicorn

我一直在对在Unicorn上运行的Heroku Rails-app上的大约550 Mb的内存使用进行故障排除,这会导致大约2k ms的响应时间。

我查看了我的New Relic-graphs并意识到我正在运行两个实例,但我只有一个工人,而我只运行一个dyno(Hobby)。我不明白为什么有两个实例!好像我不小心使用了“鬼”实例。这只发生在我使用Unicorn时,而不是在Puma上。

编辑:我添加了一名工人,看看如果我跑了2名工人会发生什么。根据New Relic,这导致3个实例正在运行,因此它不会复制它只添加一个ghost实例。

每10分钟一次我运行一个简短的计划任务,可以在图表中看到。顺便说一句,ENV["WEB_CONCURRENCY"]没有设定。

enter image description here

# 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)

这种行为是预期的还是我在这里做了一些非常错误的事情?什么可能导致第二个实例运行?是否有可能在启动时意外启动应用程序上的两个版本?

1 个答案:

答案 0 :(得分:0)

我删除了调度程序,一些gems和dalli缓存,这删除了额外/ ghost实例。然后我把它们一个接一个地放回去,但它只停留在一个实例中。即完全相同的设置,以前有两个实例,现在已降至1(这是最有意义的)。

内存消耗仍然相同所以我将其标记为New Relic bug。不幸的是