导致with_lock性能问题的原因是什么?

时间:2016-02-11 22:11:38

标签: ruby-on-rails activerecord rspec-rails

我想了解导致性能影响的原因。

我在RSpec中进行了测试,其中一个函数被调用了1000次。我注意到,随着for循环的进行,调用变得越来越慢。

我确定问题是由于更改了with_lock内部和with_lock之外的状态,但无法解释原因。

这是重现此问题的最小代码(仅在RSpec中发生,通过控制器运行并浏览到包含测试的页面不会产生减速):

c = Conversation.new
c.save!

for i in 0..1000
    puts i
    c.with_lock do
        c.pending = true
        c.save!
    end
    c.pending = false
    c.save!
end

删除with_lock并且没有性能问题 没有外面的c.pending = false / c.save!没有性能问题

请注意,数据库中只有一个条目,而不是我们创建了大量条目。

PS:我发现这是因为我的生产速度慢,我需要重现,但它只发生在拥有大量Conversation对象的用户身上(并且因为with_lock而发生,因为根据我在开发中的控制器中看到的数据库调用是使用主键的直接提交(没有用户具有或多或少的Conversation对象的概念))。我认为在with_lock结束时自动重新加载可以“解释”那个,因为我的User对象上有一个“has_many:conversation,through :: xxxxxx”关系。但我真的无法解释测试环境中性能问题的来源(也不确定prod)。

0 个答案:

没有答案