我一直在对在Unicorn上运行的Heroku Rails-app上的大约550 Mb的内存使用进行故障排除,这会导致大约2k ms的响应时间。
我查看了我的New Relic-graphs并意识到我正在运行两个实例,但我只有一个工人,而我只运行一个dyno(Hobby)。我不明白为什么有两个实例!好像我不小心使用了“鬼”实例。这只发生在我使用Unicorn时,而不是在Puma上。
编辑:我添加了一名工人,看看如果我跑了2名工人会发生什么。根据New Relic,这导致3个实例正在运行,因此它不会复制它只添加一个ghost实例。
每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)
这种行为是预期的还是我在这里做了一些非常错误的事情?什么可能导致第二个实例运行?是否有可能在启动时意外启动应用程序上的两个版本?
答案 0 :(得分:0)
我删除了调度程序,一些gems和dalli缓存,这删除了额外/ ghost实例。然后我把它们一个接一个地放回去,但它只停留在一个实例中。即完全相同的设置,以前有两个实例,现在已降至1(这是最有意义的)。
内存消耗仍然相同所以我将其标记为New Relic bug。不幸的是