Случайные части рельсов в 100 раз медленнее, чем ожидалось

У меня есть довольно большое представление ответа, разбитое на частичные структуры, структура которых выглядит так, где * указывает, что эта часть загружается более одного раза:

show
-responses
--response*
---comments
----comment*
---comment_form
-stats

Моя проблема заключается в том, что в зависимости от размера страницы для рендеринга большинства этих фрагментов требуется 10-20 мс, однако для рендеринга нескольких из этих фрагментов требуется 800-1000 мс. Кажется, нет шаблона, в котором он есть, часто бывает то же самое, если я быстро обновляюсь, а часто нет.


person msaspence    schedule 10.02.2013    source источник
comment
предполагая, что вы тестируете МРТ, я бы подумал, что это GC.   -  person phoet    schedule 10.02.2013
comment
@msaspence, что происходит, когда вы не используете частичное, резко ли сокращается общее время?   -  person Viren    schedule 10.02.2013
comment
Да, если я не использую частичные загрузки, общее время резко сокращается примерно на сумму, которую добавляют эти аномальные частичные нагрузки. Это не лучший вариант для меня, так как это большой файл представления, и я почти наверняка буду использовать частичные изображения в других представлениях в какой-то момент в ближайшее время. Я использую МРТ, могу ли я что-нибудь сделать, чтобы снизить стоимость ГХ?   -  person msaspence    schedule 10.02.2013
comment
Благодаря тому, что @Viren указал мне на GC, я много читал в этой области и теперь намного лучше понимаю проблему.   -  person msaspence    schedule 11.02.2013


Ответы (1)


Сначала используйте

<%= render partial: 'partial', collection: @collection, as: c %>

скорее, чем

<% @collection.each do |c| %>  
  <%= render partial: 'partial', locals: { c: c } %>  
<% end %>

это очевидно, я не знаю, почему я этого не делал. Предусмотрены некоторые улучшения, но не огромное количество.

Если вы используете 1.9.3, увеличение этих переменных среды имело огромное значение, сбивая запрос примерно на 20%:

RUBY_HEAP_MIN_SLOTS=600000 # This is 60(!) times larger than default
RUBY_GC_MALLOC_LIMIT=59000000 # This is 7 times larger than default
RUBY_HEAP_FREE_MIN=100000 # This is 24 times larger than default

через: http://www.web-l.nl/posts/15-tuning-ruby-s-garbage-collector-with-rvm-and-passenger

person msaspence    schedule 12.02.2013
comment
Изменение параметров Ruby GC для улучшения вашей производительности вообще не отвечает на ваш вопрос: даже если он лучше работал на вашей машине, во многих случаях это не так, и вы как будто говорите Как потратить больше денег? Попробуйте снять больше денег с банкомата - person Augustin Riedinger; 10.06.2014