Як “розігріти” організаційну структуру? Коли стає "холодно"?


118

Ні, відповідь на моє друге питання - не зима.

Передмова:

Нещодавно я багато досліджував Entity Framework, і те, що мене постійно турбує, - це його ефективність, коли запити не прогріваються, так звані холодні запити.

Я переглянув статтю щодо продуктивності для Entity Framework 5.0. Автори ввели поняття « Теплі та холодні» запити та як вони відрізняються, що я також помітив сам, не знаючи про їх існування. Тут, напевно, варто згадати, що у мене за спиною лише півроку досвіду.

Тепер я знаю, які теми я можу досліджувати додатково, якщо хочу краще зрозуміти рамки щодо продуктивності. На жаль , більша частина інформації в Інтернеті є застарілим або роздутим із встановленням суб'єктивних, отже , моя нездатністю знайти додаткову інформацію про теплих проти Cold запитів теми.

В основному те, що я помічав до цих пір, - це те, що коли мені доведеться перекомпілювати чи переробляти хіти, мої початкові запити стають дуже повільними. Будь-яке наступне зчитування даних швидко ( суб'єктивно ), як і очікувалося.

Ми будемо переходити на Windows Server 2012, IIS8 та SQL Server 2012 і, будучи молодшим, я фактично отримав собі можливість випробувати їх перед рештою. Я дуже радий, що вони запровадили модуль зігрівання, який підготує мою заявку до першого запиту. Однак я не впевнений, як діяти з прогріванням моєї сутності.

Що я вже знаю, варто зробити:

  • Створіть мої перегляди заздалегідь, як було запропоновано.
  • Врешті-решт перенесіть мої моделі в окрему збірку.

Що я вважаю робити, йдучи здоровим глуздом, ймовірно, неправильний підхід :

  • Дані фіктивних даних читаються при запуску програми, щоб зігріти речі, генерувати та перевіряти моделі.

Запитання:

  • Який найкращий підхід мати високу доступність в моїй Entity Framework в будь-який час?
  • У яких випадках Entity Framework знову стає "холодним"? (Перекомпіляція, переробка, перезапуск IIS тощо)

З’ясуйте, чи це найбільше вражає це генерування перегляду чи компіляція запитів. Якщо це перегляд, тоді використовуйте попередньо складені подання. Якщо це запити - чи є у вас велика складна ієрархія? Зауважте, що дорогі речі, як правило, трапляються один раз у домені додатка і зберігаються в кеш-пам'яті, тому ви відчуваєте подібні проблеми, коли домен додатка завантажується та створюється новий.
Pawel

Я вже згадував покоління поглядів @Pawel, ієрархія не є складною, навіть небагато. Але проблема також є основною. Після сказаного, я вивчу, коли домен додатка вивантажується. Однак це все ще не допомагає іншій проблемі, яка зігріває Entity Framework у випадку, як ви сказали, домен додатка не завантажується. На даний момент здається, що домен додатка вивантажується більше, ніж належить, і я не впевнений, чому переробка відбувається лише вночі, на холостому ходу встановлено 0.
Петро

4
Чому, на вашу думку, неправильний підхід до читання фіктивних даних?
Джош Хайцман

5
Це просто не вірно, я думав, що може бути щось більш елегантне, про що я не знаю. Але якщо це єдине рішення, і хтось із хорошими знаннями може підтвердити, що іншого способу немає, я просто піду з ним.
Петро

1
Одне питання, з яким я стикався з тим, як пул додатків вимикається після періоду відсутності активності (через низький трафік), - це створити службу, яка надсилає запит через встановлений інтервал часу на одну із ваших сторінок. Це запобігає великій затримці до того, як пул додатків перезапуститься при першому запиті. Або ви можете скористатися безкоштовним сервісом, таким як www.pingalive.com, для того, щоб підключити домен / ip Це також запобігає очищенню кешованих об'єктів до їх закінчення.
hatsrumandcode

Відповіді:


55
  • Який найкращий підхід мати високу доступність в моїй Entity Framework в будь-який час?

Ви можете скористатися поєднанням попередньо створених представлень та статичних запитів, складених.

Статичні компільовані кейси хороші тим, що вони швидко і просто записуються та сприяють підвищенню продуктивності. Однак з EF5 не потрібно збирати всі запити, оскільки EF автоматично скомпонує запити. Єдина проблема полягає в тому, що ці запити можуть загубитися, коли кеш буде змінено. Тому ви все ще хочете посилатися на власні складені запити для тих, які трапляються лише дуже рідко, але вони дорогі. Якщо ви покладете ці запити в статичні класи, вони будуть складені, коли вони вперше потрібні. Для деяких запитів це може бути занадто пізно, тому ви можете захопити компіляцію цих запитів під час запуску програми.

Попереднє створення поглядів - це інша можливість, яку ви згадуєте. Тим більше, що для тих запитів, які збираються дуже довго, і які не змінюються. Таким чином ви переміщуєте накладні показники продуктивності від часу виконання до компіляції. Також це не спричинить затримки. Але звичайно ця зміна переходить у базу даних, тому з нею не так просто впоратися. Код є більш гнучким.

Не використовуйте багато успадкування ТПТ (це загальна проблема ефективності в EF). Не будуйте свої ієрархії спадщини занадто глибокими і не надто широкими. Лише 2-3 властивостей, характерних для певного класу, може бути недостатньо, щоб вимагати власного типу, але вони можуть бути оброблені як необов'язкові (зведені) властивості до існуючого типу.

Не тримайтеся на одному контексті довго. Кожен екземпляр контексту має свій кеш першого рівня, який уповільнює продуктивність із збільшенням його. Створення контексту є дешевим, але управління державою всередині кешованих об'єктів контексту може стати дорогим. Інші кеші (план запитів та метадані) поділяються між контекстами і загинуть разом із AppDomain.

Загалом, вам слід переконатися, що часто розподіляйте контексти та використовуєте їх лише на короткий час, щоб ви могли швидко запустити свою програму, складати запити, які рідко використовуються, та надавати попередньо переглянуті запити, які є критичними для роботи та часто використовуються.

  • У яких випадках Entity Framework знову стає "холодним"? (Перекомпіляція, переробка, перезапуск IIS тощо)

В основному, кожен раз, коли ви втрачаєте свій AppDomain. IIS здійснює перезавантаження кожні 29 годин , тому ви ніколи не можете гарантувати, що у вас будуть примірники. Також через деякий час без активності AppDomain також вимикається. Спробуйте спробувати швидко підійти. Можливо, ви можете виконати якусь ініціалізацію асинхронно (але остерігайтеся проблем із багатопотоковою передачею). Ви можете використовувати заплановані завдання, які викликають фіктивні сторінки у вашій програмі, коли немає запитів, щоб запобігти загибелі AppDomain, але це згодом буде.

Я також припускаю, що коли ви змінюєте конфігураційний файл або змінюєте збірки, відбудеться перезапуск.


Дякую Андре, саме це мені було потрібно.
Петро

@Andreas Насправді навіть зі статичними складеними запитами перший запуск занадто довгий. Чи є якийсь спосіб розігріти їх, окрім: Проведення фіктивних даних читається в програмі Start Start, щоб зігріти речі, генерувати та перевіряти моделі.
manishKungwani

@Andreas Отже, Entity Framework5 потрібен він чи ні? що відрізняється, якщо використовувати його на ef5 (я маю на увазі все ще повільний або маленький кляр або не відрізняється?)
qakmak

"Статичні CompiledQuerys хороші тим, що вони швидко і легко записуються та допомагають знизити продуктивність." Зниження продуктивності?
Математики

9

Якщо ви шукаєте максимальну ефективність для всіх дзвінків, слід уважно розглянути свою архітектуру. Наприклад, може мати сенс попередньо кешувати часто використовувані огляди в оперативній пам’яті сервера, коли програма завантажується, а не використовує дзвінки до бази даних для кожного запиту. Ця методика забезпечить мінімальний час відгуку програми для часто використовуваних даних. Однак ви повинні бути впевнені, що маєте чітко керовану політику придатності або завжди очищайте кеш-пам'ять, коли вносяться зміни, які впливають на кешовані дані, щоб уникнути проблем з одночасністю.

Взагалі, ви повинні прагнути розробити розподілену архітектуру так, щоб вимагати запитів даних на основі IO лише тоді, коли локально кешована інформація стає несвіжою або має бути транзакційною. Будь-який запит даних «по дроту», як правило, займе 10-1000 разів більше часу, ніж локальний, у кеш-пам'яті пошуку. Один лише той факт часто робить дискусії про "холодні та теплі дані" неістотними порівняно з проблемою "локальне проти віддаленого".


Це хороший момент, який я часто ігнорую, в той час як отримую розгубленість щодо необмеженої продуктивності фреймворку. Я детальніше розбираюсь у цьому питанні та більш детально досліджую принципи кешування. Однак "холодний проти теплий" з точки зору EF - це все-таки те, що я хочу зрозуміти краще.
Петро

2
"Один лише цей факт часто робить дискусії про" холодні та теплі дані "неістотними порівняно з" місцевою та віддаленою "проблемою даних". Не зовсім. Якщо у вас немає локального кешу (який ви не будете спочатку), вам все одно доведеться натиснути на EF та зазнати болю при ініціалізації, щоб створити кеш. Там же, де ваш кеш неініціалізований, EF буде ініціалізовано. Тож додавання шару кешування може не допомогти, якщо єдиним питанням буде час ініціалізації EF, але це додасть ще один рівень складності ...
MikeJansen

8

Загальні поради.

  • Виконайте суворий журнал, включаючи доступ до нього та час запиту .
  • Виконуйте фіктивні запити під час ініціалізації програми для прогрівання завантаження дуже повільними запитами, які ви отримуєте з попереднього кроку.
  • Не переймайтеся оптимізацією, якщо це не справжня проблема, спілкуйтеся зі споживачем програми та запитуйте. Будьте комфортні, маючи безперервний цикл зворотного зв'язку, аби лише зрозуміти, що потребує оптимізації .

Тепер пояснимо, чому запити про манекени - це неправильний підхід .

  • Менша складність - Ви нагріваєте додаток таким чином, що він буде працювати незалежно від змін у рамках, і вам не потрібно розбиратись, можливо, прикольні інтерфейси API / рамки, щоб зробити це правильно .
  • Більше покриття - Ви прогріваєте всі шари кешування відразу, пов'язані з повільним запитом.

Пояснити, коли кеш отримує "Cold".

Це відбувається на будь-якому шарі у вашій рамці, який застосовує кеш, у верхній частині сторінки продуктивності є хороший опис .

  • Коли коли-небудь кеш повинен бути перевірений після потенційної зміни, яка робить кеш застарілим, це може бути тайм-аут або більш розумним (тобто зміною кешованого елемента).
  • Коли елемент кешу вилучається, алгоритм виконання цього описується в розділі "Алгоритм вилучення кешу" в статті про ефективність, яку ви пов’язали , але коротко.
    • LFRU (найменш часто - останнім часом) кеш на кількість звернень та вік з обмеженням 800 елементів.

Інші речі, які ви згадали, зокрема рекомпіляція та перезапуск IIS, очищають або частини, або всі кеші пам'яті.


Це ще одна корисна відповідь, яку дуже цінують.
Петро

3

Як ви вже заявляли, використовуйте "попередньо створені перегляди", це дійсно все, що вам потрібно зробити.

Витяг із посилання : "Коли генеруються представлення даних, вони також перевіряються. З точки зору продуктивності переважна більшість витрат на генерування перегляду - це фактично перевірка переглядів".

Це означає, що ступінь продуктивності буде мати місце при складанні моделі. Потім ваш контекстний об'єкт буде пропускати "холодний запит" і залишатись чуйним протягом тривалості життєвого циклу контекстного об'єкта, а також подальших нових контекстів об'єктів.

Виконання нерелевантних запитів не матиме іншої мети, крім споживання системних ресурсів.

Ярлик ...

  1. Пропустіть усі додаткові роботи заздалегідь створених подань
  2. Створіть свій об'єктний контекст
  3. Вимкніть цей солодкий нерелевантний запит
  4. Тоді просто зберігайте посилання на ваш об'єктний контекст протягом тривалості процесу (не рекомендується).


2

Я не маю досвіду в цьому контексті. Але в інших контекстах, наприклад, Solr, цілком підроблені читання не принесуть великої користі, якщо ви не зможете кешувати весь БД (або індекс).

Кращим підходом було б записувати запити, витягувати найпоширеніші з журналів і використовувати їх для прогрівання. Будьте впевнені, що не записуйте запити на розминку та не видаляйте їх із журналів, перш ніж продовжувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.