предварительная загрузка ActiveRecord, вызывающая последующее снижение производительности

Выполнение большого запроса ActiveRecord с большим количеством периферийных объектов.

Добавление «.includes» (предварительная загрузка) значительно ускоряет его, сжимая все N+1.

Затем страница отображается быстро и выдает это в журналы:

Completed 200 OK in 504ms (Views: 104.2ms | ActiveRecord: 86.0ms)

Однако затем проходит * 90 СЕКУНД *, пока страница не будет фактически отправлена ​​в браузер (или curl; мы тестировали оба варианта).

В течение этого времени процесс ruby ​​имеет процессор, привязанный к 100%.

Если мы удалим «.includes» (предварительную загрузку), он вернется к нормальной дрянной производительности без полутораминутной пропасти между рендерингом страницы и доставкой браузера.

WTF вызывает ли предварительная загрузка такой эффект!?

Один коллега выдвинул гипотезу о проблеме со сборкой мусора; как я могу проверить эту теорию?

Рельсы 3.2.12

Ruby 1.9.3 (проверено p286 и p327)


person Teflon Ted    schedule 08.03.2013    source источник


Ответы (1)


Нашел проблему; это была жемчужина Bullet (https://github.com/flyerhzm/bullet).

Этот драгоценный камень ловко находит и сообщает о запросах N + 1 и чрезмерно усердных включениях, но в случае очень больших наборов результатов он значительно снижает производительность приложения.

person Teflon Ted    schedule 11.03.2013