【问题标题】:Rails partials rendering has 10x spikes render timeRails 局部渲染具有 10 倍的峰值渲染时间
【发布时间】:2013-03-25 14:22:26
【问题描述】:

查看ruby mini-profiler 的输出,我注意到这种模式有 5-6 个局部渲染,每个渲染大约 6-7 毫秒,然后一个渲染关闭 60-70 毫秒。我想知道是什么原因造成的,它看起来像是某种潮红。所有模型数据都是在视图渲染开始时加载的,所以我知道不是延迟加载造成的。

 Rendering: application/_row     7.1    +1107.0 
 Rendering: application/_row     68.7   +1115.0 
 Rendering: application/_row     6.7    +1184.0 
 ...     
 Rendering: application/_row     6.5    +1234.0 
 Rendering: application/_row     65.2   +1241.0 
 Rendering: application/_row     6.6    +1306.0 
 ...     
 Rendering: application/_row     6.6    +1321.0 
 Rendering: application/_row     66.6   +1328.0 
 Rendering: application/_row     6.6    +1395.0 
 ...     
 Rendering: application/_row     6.6    +1444.0 
 Rendering: application/_row     65.4   +1451.0 

Ruby 1.9.3p194,Rails 3.2.11

【问题讨论】:

  • 可能是 GC 开始了。虽然 60ms 似乎很长。
  • 我在开发过程中也经常看到这种情况。我很想知道为什么会这样。
  • 忘了说:开发,在thin 服务器上。
  • 您可以尝试使用更全面的分析器...
  • 这只是一个猜测,我会看看 GC 设置。也许内存分配的默认值比您真正想要(甚至需要)更多地加热 GC。讨论的人在这里写博客:meta.discourse.org/t/tuning-ruby-and-rails-for-discourse/4126

标签: ruby-on-rails ruby partial-views mvc-mini-profiler


【解决方案1】:

这是最确定的 MRI 的垃圾收集器刷内存。我用一个简单的 Rails 应用和部分应用做了一些测试:

100.times{Test.new}

我可以像你一样看到尖峰:

Rendered tests/_row.html.erb (3.9ms)
Rendered tests/_row.html.erb (45.3ms)
Rendered tests/_row.html.erb (5.2ms)
...
Rendered tests/_row.html.erb (42.8ms)

使用迷你分析器,很容易检查 GC 被调用了多少次,更重要的是,它运行了多长时间。对我来说,这些数字完全匹配。如果有 10 个尖峰,那么还有 10 (+/-1) 个 GC 调用,而且 GC 的运行时间正是正常渲染和耗时更长的渲染之间的差异。

要使用 mini-profiler 的 GC 计时器,请将 ?pp=profile-gc-time 附加到您的 URL。还有一篇很棒的帖子是关于 tuning Ruby with mini-profiler。

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多