在查看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
发布于 2013-04-04 04:14:08
这肯定是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的运行时间正好是正常渲染和耗时更长的渲染之间的差异。
要使用mini-profiler的GC计时器,请将?pp=profile-gc-time附加到您的URL。还有一篇关于tuning Ruby和mini-profiler的很棒的文章。
https://stackoverflow.com/questions/15795478
复制相似问题