我是ruby / rails的新手,过去2天我一直在解决一个问题,我希望这个论坛中有人可以帮我解决这个问题。
我正在使用rails 4并使用Passenger + Nginx和Mysql数据库(mysql2适配器)在生产中运行应用程序。我在ProductsController.rb中有以下代码(log_info是我的自定义日志包装器,只调用Rails记录器):
def index
log_info("ProductsController", "Getting Products...")
@products = Product.get_products(params[:offset])
log_info("ProductsController", "Got all Products...")
# populate access_url before sending the data through
update_products_with_access_url(@products)
end
以下是Product model中的get_products函数的定义:
def self.get_products(products_offset)
products_offset ||= 0
Product.includes(:categories, :suppliers).
where(active: true).order(updated_at: :desc).
limit(20).
offset(products_offset * 20)
end
问题是,当调用索引操作时,我的应用程序在生产中挂起(在dev中工作正常)几分钟。这种行为几乎发生在一半的时间 - 在另一半时间内工作正常。
我可以在日志中看到操作已被调用但未执行。以下是日志文件中的代码段:
I, [2015-06-10T13:31:01.802673 #14916] INFO -- : Processing by ProductsController#index as HTML
I, [2015-06-10T13:33:09.718339 #14916] INFO -- : [INFO][2015-06-10 13:33:09 UTC][ProductsController][Getting Products...]
I, [2015-06-10T13:33:09.719365 #14916] INFO -- : [INFO][2015-06-10 13:33:09 UTC][ProductsController][Got all Products...]
D, [2015-06-10T13:33:09.720980 #14916] DEBUG -- : Product Load (0.8ms) SELECT `products`.* FROM `products` WHERE `products`.`active` = 1 ORDER BY `products`.`updated_at` DESC LIMIT 12 OFFSET 0
D, [2015-06-10T13:33:09.725110 #14916] DEBUG -- : ProductCategory Load (0.5ms) SELECT `product_categories`.* FROM `product_categories` WHERE `product_categories`.`product_id` IN (30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19)
正如您所看到的,上面两行日志文件之间至少有2分钟的差异。并且日志显示索引操作已接收到调用,但我不确定为什么执行该索引操作中的第一行需要这么长时间(有时超过5分钟)。我怀疑有某种缓存发生。我之前认为呼叫可能会挂在连接MySQL数据库,但现在不确定。我在这里错过了什么吗?
有人可以帮我解决此应用程序挂起问题吗?
答案 0 :(得分:1)
请检查是否有任何过滤器,通常它们可能是这种挂起的原因。