Ruby on rails 后续的unicorn请求非常慢
我在unicorn上运行rails 2应用程序,遇到了奇怪的行为。当我第一次启动服务器并发出第一个请求时,整个页面加载的速度非常快,小于3秒。每个后续请求需要30-45秒以上的时间。当我跟踪日志时,在前30多秒内,实际上没有记录任何内容。然后页面突然加载,日志显示出来。这就好像请求只是挂起30秒以上 当我使用script/server或thin运行相同的代码时,它运行得很快,并且与预期的一样 目前我们正在Heroku上运行unicorn,没有这些问题。我正在迁移到AWS的过程中,这就是我遇到问题的地方。在运行unicorn时,我在本地VM上也遇到了同样的问题 这是我的配置 bundle exec unicorn-c./config/unicorn.rb 更新Ruby on rails 后续的unicorn请求非常慢,ruby-on-rails,ruby,amazon-web-services,unicorn,Ruby On Rails,Ruby,Amazon Web Services,Unicorn,我在unicorn上运行rails 2应用程序,遇到了奇怪的行为。当我第一次启动服务器并发出第一个请求时,整个页面加载的速度非常快,小于3秒。每个后续请求需要30-45秒以上的时间。当我跟踪日志时,在前30多秒内,实际上没有记录任何内容。然后页面突然加载,日志显示出来。这就好像请求只是挂起30秒以上 当我使用script/server或thin运行相同的代码时,它运行得很快,并且与预期的一样 目前我们正在Heroku上运行unicorn,没有这些问题。我正在迁移到AWS的过程中,这就是我遇到问题
我已经把范围缩小到阻止工人完成的事情。我有一个30秒的超时,即使请求只需要1秒就可以完成,它也不会接受更多的请求,直到超时发生。有没有什么好方法可以找出阻止worker可用的原因?本地VM/EC2设置和heroku设置之间的ruby和gem版本是否匹配?是的。相同的Gemfile和相同的Gemfile.lock您的VM和EC2机器运行相同的操作系统内核吗?我怀疑heroku内核是不同的。是的,VM和EC2是不同的。内核不同的可能性很大。只是想一想,但是database.yml中的数据库池大小是多少?
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2)
timeout 90
preload_app true
listen (ENV['PORT'] || 8000), :backlog => Integer(ENV['UNICORN_BACKLOG'] || 20)
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
# AR
ActiveRecord::Base.connection.disconnect!
# Redis
begin
Timeout.timeout(2) { REDIS.quit }
rescue Exception
# This likely means the redis service is down
end
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
# AR
ActiveRecord::Base.establish_connection
# Redis
uri = URI.parse(ENV["REDIS_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
# Dalli
Rails.cache.reset
# Mongoid
Mongoid::Setup.run
end