查看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
答案 0 :(得分:5)
这是最确定的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)
使用mini-profiler,可以很容易地检查GC被调用的次数,更重要的是,它运行了多长时间。对我来说,这些数字非常匹配。如果有10个尖峰,那么还有10个(+/- 1)GC调用,并且GC的运行时间恰好是正常渲染和花费更长时间的渲染之间的差异。
要使用迷你探查器的GC计时器,请将?pp=profile-gc-time
附加到您的网址。还有一篇关于tuning Ruby与mini-profiler的好文章。