Ruby on rails 4 RubyonRails-activerecord和view呈现时间小,但响应时间大
我有一个RubyonRails应用程序,它可以很好地处理大多数API请求,但对于某些API请求,它只是挂起。ActiveRecord查询在短时间内完成,视图也在短时间内呈现,但响应时间非常长 Rails版本是4.2.5,Ruby版本是2.2.0,我使用的数据库是Postgresql。下面我附上我的GEM文件和生产日志,以及发生这种情况的代码 生产日志Ruby on rails 4 RubyonRails-activerecord和view呈现时间小,但响应时间大,ruby-on-rails-4,ruby-2.2,Ruby On Rails 4,Ruby 2.2,我有一个RubyonRails应用程序,它可以很好地处理大多数API请求,但对于某些API请求,它只是挂起。ActiveRecord查询在短时间内完成,视图也在短时间内呈现,但响应时间非常长 Rails版本是4.2.5,Ruby版本是2.2.0,我使用的数据库是Postgresql。下面我附上我的GEM文件和生产日志,以及发生这种情况的代码 生产日志 I, [2019-09-07T09:23:45.748270 #22745] INFO -- : Started GET "/api/v3/re
I, [2019-09-07T09:23:45.748270 #22745] INFO -- : Started GET "/api/v3/restaurants/1/accepted_orders?skip_search=1" for
165.228.89.233 at 2019-09-07 09:23:45 +0000
I, [2019-09-07T09:23:45.753331 #22745] INFO -- : Processing by Api::V3::Staff::OrdersController#accepted_index as JSON
I, [2019-09-07T09:23:45.753387 #22745] INFO -- : Parameters: {"skip_search"=>"1", "id"=>"1"}
D, [2019-09-07T09:23:45.756807 #22745] DEBUG -- : User Load (2.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 6]]
D, [2019-09-07T09:23:45.761643 #22745] DEBUG -- : User Load (3.9ms) SELECT "users".* FROM "users" WHERE "users"."uid" = $1 LIMIT 1 [["uid", "example@gmail.com"]]
D, [2019-09-07T09:23:45.765724 #22745] DEBUG -- : Eula Load (3.1ms) SELECT "eulas".* FROM "eulas" WHERE "eulas"."is_latest" = $1 LIMIT 1 [["is_latest", "t"]]
D, [2019-09-07T09:23:45.768793 #22745] DEBUG -- : Privacy Load (2.7ms) SELECT "privacies".* FROM "privacies" WHERE "privacies"."is_latest" = $1 LIMIT 1 [["is_latest", "t"]]
D, [2019-09-07T09:23:45.772602#22745] DEBUG -- : Restaurant Load (3.0ms) SELECT "restaurants".* FROM "restaurants" WHERE "restaurants"."id" = $1 LIMIT 1 [["id", 1]]
D, [2019-09-07T09:23:46.293350 #22745] DEBUG -- : Order Load (519.6ms) SELECT "orders".* FROM "orders" WHERE "orders"."restaurant_id" IN (1)
D, [2019-09-07T10:44:50.564263 #22745] DEBUG -- : (19.8ms) SELECT COUNT(*) FROM "orders" WHERE "orders"."status" = $1 AND "orders"."restaurant_id" = 1 AND ( DATE(orders.created_at) >= '2019-09-07 09:45:50 UTC') [["status", 1]]
D, [2019-09-07T10:44:50.577108 #22745] DEBUG -- : (11.7ms) SELECT COUNT(*) FROM "orders" WHERE "orders"."status" = $1 AND "orders"."restaurant_id" = 1 AND ( DATE(orders.created_at) >= '2019-09-07 09:45:50 UTC') [["status", 0]]
D, [2019-09-07T10:44:50.580691 #22745] DEBUG -- : User Exists (1.5ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'example@gmail.com' AND "users"."id" != 6) LIMIT 1
D, [2019-09-07T10:44:50.582116 #22745] DEBUG -- : User Exists (0.6ms) SELECT 1 AS one FROM "users" WHERE ("users"."username" = 'Staff 1' AND "users"."id" != 6) LIMIT 1
D, [2019-09-07T10:44:50.584594#22745] DEBUG -- : User Exists (1.8ms) SELECT 1 AS one FROM "users" WHERE ("users"."phone_number" = '+777777777' AND "users"."id" != 6) LIMIT 1
I, [2019-09-07T10:44:50.586265 #22745] INFO -- : Completed 200 OK in 4864833ms (Views: 0.3ms | ActiveRecord:
570.2ms)
代码中有错误的部分
api :GET, '/v3/restaurants/:id/accepted_orders', 'Returns all accepted orders of a restaurant (for staff and owners)'
param :id, String, desc: 'id of the restaurant', required: true
def accepted_index
query = " DATE(orders.created_at) >= '#{59.minutes.ago}'" if current_user.staff?
accepted = Order.where(status: Order.statuses[:accepted], restaurant: @restaurant).where(query)
pending = Order.where(status: Order.statuses[:pending], restaurant: @restaurant).where(query)
render json: {accepted_count: accepted.count, pending_count: pending.count}
end
Gemfile
source 'https://rubygems.org'
ruby '2.2.0'
gem 'rails', '4.2.5'
gem 'pg'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'jbuilder', '~> 2.0'
gem 'annotate'
gem 'activeadmin', github: 'activeadmin'
gem 'paper_trail', '~> 4.0.0'
gem 'dotenv-rails'
# MailChimp integration
gem 'gibbon'
gem 'google_directions'
gem 'geocoder'
gem 'stripe', :git => 'https://github.com/stripe/stripe-ruby'
# The push notification service.
gem 'rpush', github: 'rpush/rpush'
gem 'prawn-rails'
gem 'prawn-table'
gem 'active_admin_datetimepicker'
gem 'phony_rails'
gem 'closure_tree'
gem 'whenever', require: false
group :development, :test do
gem 'byebug'
end
group :development do
gem 'pry'
gem 'web-console', '~> 2.0'
gem 'spring'
gem 'letter_opener'
end
gem 'apipie-rails'
gem 'devise'
gem 'high_voltage'
gem 'simple_form'
gem 'rack-cors', :require => 'rack/cors'
gem 'omniauth'
gem 'devise_token_auth'
gem 'sidekiq', '~> 4.0', '>= 4.0.1'
# gem 'ckeditor', '~> 4.1', '>= 4.1.5'
gem 'socket.io-client-simple'
gem 'houston'
gem 'fancybox-rails', '~> 0.3.0'
gem 'mini_magick', '~> 4.3', '>= 4.3.6'
gem 'carrierwave', '~> 0.10.0'
gem 'fog', '~> 1.36'
gem 'chosen-rails'
gem 'twilio-ruby', '~> 4.11.1'
group :development do
gem 'better_errors'
gem 'quiet_assets'
gem 'rails_layout'
gem 'spring-commands-rspec'
gem 'capistrano', '~> 3.1.0'
gem 'capistrano-bundler', '~> 1.1.2'
gem 'capistrano-rails', '~> 1.1.1'
gem 'capistrano-rvm', github: "capistrano/rvm"
gem 'capistrano-sidekiq'
gem 'rest-client'
end
group :development, :test do
gem 'factory_girl_rails'
gem 'faker'
gem 'rspec'
gem 'fakeredis'
gem 'rspec-rails'
gem 'shoulda-matchers', '~> 3.0'
gem 'shoulda-callback-matchers', '~> 1.1.1'
gem 'redis-namespace'
end
group :test do
gem 'capybara'
gem 'database_cleaner'
gem 'launchy'
gem 'selenium-webdriver'
end
gem 'sinatra', :require => nil
在生产服务器上,我使用nginx和Passenger
谢谢没有足够的信息进行调试,但我怀疑存在某种资源锁定。您还需要什么信息,请告诉我,我将尝试获取。查看现有日志,在加载所有订单和计算订单之间有1小时的间隔。我会把搜索的重点放在这两条代码之间的代码路径上。另外,请查看监控和记录慢速Postgres查询。没有足够的信息进行调试,但我怀疑存在某种资源锁定。您还需要什么信息,请告诉我,我将尝试获取。查看现有日志,在加载所有订单和计算订单之间有1小时的间隔。我会把搜索的重点放在这两条代码之间的代码路径上。此外,还可以监视和记录慢速Postgres查询。