Одна из десяти частичек внезапно становится медленной (случайной) - PullRequest
3 голосов
/ 06 сентября 2011

Когда я смотрю на свой лог-файл, я получаю следующие строки:

...
Rendered partials/_something.html.erb (11.8ms)
Rendered partials/_something.html.erb (123.8ms)
Rendered partials/_something.html.erb (8.2ms)
Rendered partials/_something.html.erb (7.3ms)
Rendered partials/_something.html.erb (7.1ms)
Rendered partials/_something.html.erb (8.5ms)
Rendered partials/_something.html.erb (7.2ms)
Rendered partials/_something.html.erb (7.1ms)
Rendered partials/_something.html.erb (7.4ms)
Rendered partials/_something.html.erb (7.9ms)
...

Я включаю их следующим образом

@collection.each do |something|
    render :partial => 'partials/something', :locals => {:something => something}
end

Я нахожу довольно странным, что второерендеринг (из той же части) в этом случае занимает намного больше времени, чем любой другой рендеринг.Однако, когда я перезагружаю страницу, какой-то другой рендер отнимает гораздо больше времени, в то время как переменная @collection остается в том же порядке.

Я действительно не знаю, как профилировать это.Я имею в виду, что когда тот же something вызывает медленный ответ, я смогу это выяснить.Но это кажется случайным.Может ли это быть какая-то утечка памяти или так?

Надеюсь, вы знаете ответ =)!

1 Ответ

6 голосов
/ 06 сентября 2011

Это, вероятно, Сборка мусора .

Если вы используете программное обеспечение для профилирования (например, NewRelic) и интерпретатор ruby, такой как Ruby Enterprise Edition (REE), вы можете включить статистику GC и подтвердить это, а также измерить, как часто выполняется GC и сколько времени вы проводите в GC.

По мере того, как вы выделяете больше объектов / данных, вы в конечном итоге запускаете GC из-за размера данных или количества выделений. Это выглядит почти случайным и вводит задержку, которую вы видите.

Это выглядит как «потерянное время», потому что вы измеряете это в своей виртуальной машине Ruby, которая приостанавливается во время выполнения GC. Таким образом, вы видите случайные всплески, подобные этому, без активности в кодовой базе приложения.

Если вы заинтересованы в настройке производительности или поведении GC, отличное место для начала - это часть GC документов REE:

http://www.rubyenterpriseedition.com/documentation.html#_garbage_collector_and_object_space

...