这是关于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