Ruby on rails 从方法返回大对象在生产环境中运行速度慢100倍
我有一个模型,我将一个相当大的序列化对象存储为它的一个属性 从下面的日志可以看出,将此对象从一个方法传递到另一个i生产环境时,需要花费100倍的时间才能精确 奇怪的是,它并不发生在开发环境中,只发生在生产环境中。它也发生在ajax请求期间,但不确定是否相关 这是调用该方法的一段代码Ruby on rails 从方法返回大对象在生产环境中运行速度慢100倍,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个模型,我将一个相当大的序列化对象存储为它的一个属性 从下面的日志可以看出,将此对象从一个方法传递到另一个i生产环境时,需要花费100倍的时间才能精确 奇怪的是,它并不发生在开发环境中,只发生在生产环境中。它也发生在ajax请求期间,但不确定是否相关 这是调用该方法的一段代码 now = Time.now price_document = self.applied_price_document Rails.logger.info "cp_id: #{self.id
now = Time.now
price_document = self.applied_price_document
Rails.logger.info "cp_id: #{self.id} self.try :applied_price_document (2) #{Time.now - now} "
记录为1.06秒
然后,我尝试用该方法记录每条指令,以找到瓶颈,结果发现从日志中看不到瓶颈
def applied_carrier_product
start = Time.now
ancestors = CarrierProduct.find_carrier_product_ancestors(carrier_product_id: self.id).includes(:carrier_product_price).references(:carrier_product_price)
parent = ancestors.select{ |cp| cp.id == self.carrier_product_id }.first
until parent.nil? || ancestors.empty?
is_successful = parent.carrier_product_price.try('successful?')
if is_successful
Rails.logger.info "cp_id: #{self.id} end #{Time.now - start} "
return parent.carrier_product_price
end
parent = ancestors.select{ |cp| cp.id == parent.carrier_product_id }.first
end
end
在返回结果之前,我记录了方法的总运行时间,结果为0.002秒
这意味着将结果传递给调用方法大约需要1秒的时间。考虑到我连续调用这个方法多达30次,这是一个大问题
你知道为什么会这样吗?任何人都无法给你一个像样的答案,解释为什么这个问题发生在一个环境而不是另一个环境中。有太多的变量,我们都不能在这里检查。您的dev和prod数据库是否包含相同数量的数据?我会从祖先开始;您可能会在那里实例化数千个Ruby对象——这不太好。这可能是在数据库查询中应该做的事情。它永远不会超过2/3个对象,而且,正如日志所证明的,这不是罪魁祸首。当通过极不可能的返回语句将信息从一个方法传递到另一个方法时,会发生减速。我建议安装分析工具,例如,以便获得比几个时间戳日志项所能提供的更详细、更可靠的信息。事实证明,当从模型“record.price_document”访问序列化对象时,速度会减慢,其中price_document是大对象,因此反序列化是瓶颈?我们说的有多大?您使用什么数据库,以及如何序列化/反序列化对象?你跑什么?