Rails控制器操作挂起

时间:2015-06-10 13:53:02

标签: mysql ruby-on-rails ruby ruby-on-rails-4 nginx

我是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数据库,但现在不确定。我在这里错过了什么吗?

有人可以帮我解决此应用程序挂起问题吗?

1 个答案:

答案 0 :(得分:1)

请检查是否有任何过滤器,通常它们可能是这种挂起的原因。