предварително зареждане на активен запис, причиняващо влошаване на производителността след ефекта

Извършване на голяма заявка за активен запис с много периферни обекти.

Добавянето на ".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