为什么不增加更多的独角兽工人会增加吞吐量(heroku,rails,postgres,memcachier)

时间:2019-01-22 19:42:59

标签: ruby-on-rails heroku unicorn

这是关于heroku,rails,postgres,memcachier应用程序的。

导轨(3.2.16) 独角兽(4.8.3)

我们正在运行一个2倍(共享)heroku测功机集群。每个dyno都由3名工人运行独角兽,这大约是2X dyno可以处理的内存限制。

我们偶尔会遇到实例故障,其中单个实例上的请求逐渐变慢,导致该实例失败并需要重新启动。集群的其余部分不受影响。 Newrelic经常报告说,联网操作postgres,缓存或远程API在其报告的事务中花费很长时间。

我怀疑这是由于较小的网络故障/速度慢导致备份实例,导致高速缓存显示不可用(超时时间短),从而加剧了问题

为克服这个问题,我想增加并发性并离开共享测功机的世界

升级为Pm dynos似乎是个好主意

打开PM dynos,我无法通过增加工作人员数量来增加吞吐量。 Heroku指标报告称,动态负载按比例增加,但随着我增加工作人员人数,heroku指标并未报告吞吐量(RPS)的增加。

添加第二个dyno会使报告的吞吐量增加一倍

所以有那个背景。我的问题是:

我该如何研究为什么增加独角兽工人人数不会增加报告的吞吐量?

当然,如果您对直接原因有任何建议,我也欢迎您提供这些见解。 :)

unicorn.rb

UNICORN_WORKER_COUNT = (ENV.fetch('UNICORN_WORKER_COUNT', 3).to_i || 3) # amount of unicorn workers to spin up

puts "UNICORN_WORKER_COUNT=#{UNICORN_WORKER_COUNT}"

worker_processes UNICORN_WORKER_COUNT
timeout 35         # restarts workers that hang for 35 seconds, 5 seconds longer than heroku timeout

preload_app true
GC.respond_to?(:copy_on_write_friendly=) and
  GC.copy_on_write_friendly = true

before_fork do |server, worker|
  puts "Unicorn before_fork nr=#{worker.nr}"

  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|
  puts "Unicorn after_fork nr=#{worker.nr}"

  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

backlog_setting = Integer(ENV['UNICORN_BACKLOG'] || 1024)

puts "Unicorn PORT=#{ENV['PORT']} UNICORN_BACKLOG=#{backlog_setting}"

listen ENV['PORT'], :backlog => backlog_setting

0 个答案:

没有答案