Как «разогреть» Entity Framework? Когда становится «холодно»?

Нет, ответ на мой второй вопрос не зима.

Предисловие: Я

В последнее время мы много занимались исследованием Entity Framework, и меня беспокоит то, что он работает, когда запросы не разогреты, так называемые холодные запросы.

Я прошел черезсоображения производительности статья для Entity Framework 5.0. Авторы представили концепциюТеплый а такжеХолодно вопросы и как они отличаются, что я тоже заметил сам, не зная об их существовании. Вот этоВероятно, стоит упомянуть, что у меня есть только шесть месяцев опыта за моей спиной.

Теперь я знаю, какие темы я могу исследовать дополнительно, если я хочу лучше понять структуру с точки зрения производительности. К сожалению, большая часть информации в Интернете устарела или раздута с субъективностью, поэтому я не могу найти дополнительную информацию оТеплый противХолодно запрашивает тему.

В основном то, что яДо сих пор мы замечали, что всякий раз, когда мне приходится перекомпилировать или перерабатывать хиты, мои начальные запросы становятся очень медленными. Любые последующие данные читаются быстро (субъективный), как и ожидалось.

Мы'Я буду переходить на Windows Server 2012, IIS8 и SQL Server 2012, и, как младший, я на самом деле получил возможность протестировать их раньше остальных. Я'Я очень рад, что они представили модуль разогрева, который подготовит мое приложение к первому запросу. Однако я'я не уверен, как продолжить разогрев моей Entity Framework.

То, что я уже знаю, стоит сделать:

Создайте мои взгляды заранее, как предложено.Со временем перенесу мои модели в отдельную сборку.

То, что я думаю сделать, исходя из здравого смысла,возможно неправильный подход

Выполнение фиктивных операций чтения данных при запуске приложения для разогрева, создания и проверки моделей.

Вопросы:

Каков наилучший подход для обеспечения высокой доступности моей Entity Framework в любое время?В каких случаях получает Entity Frameworkхолодно" снова? (Перекомпиляция, переработка, перезапуск IIS и т. Д.)
 Peter08 нояб. 2012 г., 17:22
Я уже говорил о генерации представлений @Pawel, иерархия не сложная, даже немного. Но проблема тоже принципиальная. После того, что вы сказали, яя буду исследовать, когда домен приложения выгружается. Тем не менее, это все еще неt помочь другой проблеме, которая нагревает Entity Framework в случае, если, как вы сказали, домен приложения выгружается. На данный момент кажется, что домен приложения выгружается больше, чем должно быть, и яЯ не уверен, почему, переработка происходит только ночью, на холостом ходу установлено значение 0.
 hatsrumandcode10 дек. 2013 г., 17:33
Одна проблема, с которой я столкнулся при закрытии пула приложений после определенного периода бездействия (из-за низкого трафика), - это создание службы, которая через определенный промежуток времени отправляет запрос одной из ваших страниц. Это предотвращает длительную задержку до перезапуска пула приложений при первом запросе. Или вы можете использовать бесплатный сервис, такой как www.pingalive.com, чтобы пинговать ваш домен / IP. Это также помогает предотвратить очистку кэшированных объектов до истечения срока их действия.
 John03 июл. 2017 г., 11:04
Вы на самом деле обнаружили, что компиляция запросов была медленной при профилировании? EF также очень и очень дорогая для компиляции, что увеличивает время запуска, а также требуется некоторое время, чтобы просто создать модель (в случае с кодом в первую очередь). Я неЯ не думаю, что с этим можно многое сделать, хотя ngen помогает хоть немного.
 Peter10 июл. 2017 г., 06:43
Это довольно старая ветка @John, но сейчас есть несколько значительных улучшений для запуска Entity Framework. Я думаю, что версия, возможно, уже вышла, я давно читал о ее разработке.
 Peter14 нояб. 2012 г., 09:01
Это просто неЯ чувствовал, что может быть что-то более элегантное, чем яЯ не в курсе. Но если этоЭто единственное решение, и кто-то с хорошими знаниями может подтвердить, что нетпо-другому, яЯ просто пойду с этим.
 Pawel07 нояб. 2012 г., 17:59
Выясните, является ли это генерацией представления или компиляцией запроса, которая больше всего вас поражает. Если это view gen, используйте предварительно скомпилированные представления. Если это запросы - у вас есть большая сложная иерархия? Обратите внимание, что дорогие вещи обычно происходят один раз в домене приложения и кэшируются, поэтому вы видите такие проблемы, когда домен приложения выгружается и создается новый.
 Peter01 апр. 2014 г., 15:10
@CStyle Вы можете достичь этого внутренне, не создавая отдельную службу, создав запись кэша с функцией обратного вызова, которая просто выполняет запросы и снова вставляет запись кэша. Вы можете указать время и т. Д. Я успешно использую его в одном проекте, конечно, первый запрос должен быть как-то гарантирован - модуль разогрева (предварительная загрузка / автозапуск включен) - хороший способ сделать это.
 James White06 янв. 2016 г., 23:44
Я только начал запускать поток при запуске приложения, которое создает, проверяет Any () любого DBSet (неКажется, это не имеет значения) и он сбрасывает 2 секунды с первой страницы.
 Peter23 июл. 2017 г., 04:56
@ Джон Да, это такЭто правда, но если вы правильно настроили свое приложение с помощью какой-то внутренней функции keep-alive, в дополнение к функциям предварительной загрузки IIS, которые могут вызывать для открытия определенную веб-страницу, вы можете прогреть весь веб-сайт, свой кэш и подготовить EF для первые запросы. Тот'Что я делаю по крайней мере, и если серверы стабильны, веб-сайт никогда не запускается так медленно, потому чтотехнически всегда жив и работает.
 John10 июл. 2017 г., 11:15
@ Питер Может быть, естьБыли улучшения, но во всех моих веб-приложениях EF определенно все еще является компонентом, который сильно портит время запуска. Я'Я слышал, что даже у EF Core есть дорогая разминка.
 Josh Heitzman14 нояб. 2012 г., 07:50
Как вы думаете, почему чтение фиктивных данных является неправильным подходом?

Ответы на вопрос(5)

Если вы ищете максимальную производительность для всех вызовов, вы должны тщательно продумать свою архитектуру. Например, может иметь смысл предварительно кэшировать часто используемые поиски в оперативной памяти сервера, когда приложение загружается, вместо использования вызовов базы данных при каждом запросе. Этот метод обеспечит минимальное время отклика приложения для часто используемых данных. Тем не менее, вы должны быть уверены в правильной политике истечения срока действия или всегда очищать свой кэш всякий раз, когда вносятся изменения, которые влияют на кэшированные данные, чтобы избежать проблем с параллелизмом.

В целом, вы должны стремиться спроектировать распределенные архитектуры так, чтобы запросы на основе ввода-вывода требовались только тогда, когда локально кэшированная информация устарела или должна быть транзакционной. Любой "по проводу " запрос данных обычно занимает в 10-1000 раз больше времени для извлечения, чем локальный, для извлечения из кэша памяти. Один этот факт часто вызывает дискуссии охолодные и теплые данные несущественный по сравнению с "местный против удаленного вопрос данных.

 MikeJansen07 янв. 2014 г., 16:54
Один этот факт часто вызывает дискуссии охолодные и теплые данные несущественный по сравнению с "местный против удаленного вопрос данных. "  На самом деле, нет. Если вы нене кэшируется локально (что вы выиграливначале) выВам все равно нужно будет нажать EF и испытать боль при инициализации, чтобы очистить кэш. В тех же местах, где ваш кеш неинициализирован, EF будет неинициализирован. Таким образом, добавление слоя кэширования может не помочь, если единственной проблемой является время инициализации EF, но это добавит еще один уровень сложности ...
 Peter27 нояб. 2012 г., 15:20
Это хорошая мысль, ям часто игнорируют, в то время как получают представление об исходной производительности структуры сущностей. Я'Я расскажу об этом подробнее и более подробно изучу принципы кэширования. Тем не мение, "Холод против тепла с точки зрения EF это еще то, что я хочу лучше понять ".

Общие советы.

Выполнять строгую регистрацию, включаяк чему осуществляется доступ а такжевремя запроса.Выполните фиктивные запросы при инициализации вашего приложения для горячей загрузкиочень медленно запросы, которые вы получаете с предыдущего шага.Дон»оптимизировать, если это не такЭто реальная проблема, свяжитесь с потребителем приложения и спросите. Будьте удобны, имея постоянную обратную связь, если только выяснитьчто нуждается в оптимизации.

Теперь, чтобы объяснить, почему фиктивные запросы не являютсянеправильный подход.

Меньше сложности - Вы готовите приложение так, чтобы оно работало независимо от изменений в структуре, и вы нечтобы это сделать, нужно выяснить, возможно, прикольные API / фреймворкиправильный путь.Большее покрытие - Вы разогреваете все слои кэширования одновременно, связанные с медленным запросом.

Чтобы объяснить, когда кеш получает "Холодно".

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

Когда когда-либо кэш должен быть проверен после потенциального изменения, которое делает кэш устаревшим, это может быть тайм-аут или более разумный (то есть изменение в кэшированном элементе).Когда элемент кэша удаляется, алгоритм для этого описан в разделе «Алгоритм кеширования встатья о производительности вы связали, но вкратце.LFRU (Наименее часто - недавно использовавшийся) кэш на количество посещений и возраст с ограничением в 800 предметов.

Другие вещи, которые вы упомянули, в частности, перекомпиляция и перезапуск IIS очищают либо части, либо все кэши в памяти.

 Peter30 нояб. 2012 г., 10:41
Это еще один полезный ответ, высоко ценится.

Как вы заявили, используйтепредварительно сгенерированные представления " тот'Это действительно все, что вам нужно сделать.

Извлечено из вашегоссылка на сайт: "Когда представления генерируются, они также проверяются. С точки зрения производительности, подавляющее большинство затрат на создание представлений фактически является проверкой представлений ».

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

Выполнение нерелевантных запросов не будет служить никакой другой цели, кроме как использовать системные ресурсы.

Ярлык ...

Пропустить всю эту дополнительную работу предварительно сгенерированных представленийСоздайте свой объектный контекстЗапустите этот сладкий неактуальный запросЗатем просто сохраняйте ссылку на контекст вашего объекта на время вашего процесса (не рекомендуется).
 kzfabi19 нояб. 2012 г., 15:04

У меня нет опыта в этих рамках. Но в других контекстах, например Solr, полностью фиктивные чтения не будут иметь большого значения, если вы не можете кэшировать всю БД (или индекс).

Лучшим подходом было бы регистрировать запросы, извлекать наиболее распространенные из журналов и использовать их для разогрева. Только убедитесь, что вы не регистрируете запросы прогрева и не удаляете их из журналов, прежде чем продолжить.

Решение Вопроса
Каков наилучший подход для обеспечения высокой доступности моей Entity Framework в любое время?

Вы можете выбрать сочетание предварительно сгенерированных представлений и статически скомпилированных запросов.

статическийCompiledQuerys хороши, потому что ониБыстро и легко написать и помочь повысить производительность. Однако с EF5 это неt необходимо скомпилировать все ваши запросы, так как EF автоматически скомпилирует запросы. Единственная проблема заключается в том, что эти запросы могут быть потеряны при очистке кэша. Таким образом, вы все еще хотите хранить ссылки на свои собственные скомпилированные запросы для тех, которые встречаются очень редко, но это дорого. Если вы поместите эти запросы в статические классы, они будут скомпилированы, когда онисначала требуется. Это может быть слишком поздно для некоторых запросов, поэтому вам может потребоваться принудительная компиляция этих запросов во время запуска приложения.

Как вы упомянули, еще одна возможность - это создание новых взглядов. Особенно для тех запросов, которые очень долго компилируются и нет изменить. Таким образом вы переносите накладные расходы на производительность от времени исполнения до времени компиляции. Тоже выигралне вводить никаких задержек. Но, конечно, это изменение распространяется на базу данных, поэтомуне так легко иметь дело. Код более гибкий.

Не используйте много наследования TPT (этоэто общая проблема производительности в EF). Не выстраивайте свои иерархии наследования ни слишком глубоко, ни слишком широко. Только 2-3 свойства, специфичные для некоторого класса, могут быть недостаточными для того, чтобы требовать собственный тип, но могут быть обработаны как необязательные (обнуляемые) свойства для существующего типа.

Дон»держаться за один контекст долгое время. Каждый экземпляр контекста имеет свой собственный кэш первого уровня, который замедляет производительность по мере увеличения. Создание контекста обходится дешево, но управление состоянием внутри кэшированных объектов контекста может стать дорогим. Другие кэши (план запроса и метаданные) распределяются между контекстами и умирают вместе с AppDomain.

В общем, вы должны удостовериться в том, что вы часто выделяете контексты и используете их только в течение короткого времени, чтобы вы могли быстро запускать свое приложение, чтобы вы компилировали редко используемые запросы и предоставляли предварительно сгенерированные представления для запросов, критичных для производительности и часто используемых.

В каких случаях получает Entity Frameworkхолодно" снова? (Перекомпиляция, переработка, перезапуск IIS и т. Д.)

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

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

 qakmak27 мар. 2014 г., 07:31
@Andreas Так Entity framework5 это нужно или нет? какие'Разное, если использовать его на ef5 (я имею в виду все еще медленно или немного жидкое тесто или не отличается?) "
 Peter29 нояб. 2012 г., 22:38
Спасибо Андре, это было то, что мне было нужно.
 manishKungwani04 июл. 2013 г., 21:51
@Andreas На самом деле даже при статических скомпилированных запросах первый запуск слишком длинный. Есть ли способ согреть их, кроме: Выполнение фиктивного чтения данных при запуске приложения, чтобы согреться, сгенерировать и проверить модели.
 Mathemats21 мар. 2018 г., 02:58
Статические CompiledQuerys хороши тем, что ониБыстро и легко написать и помочь снизить производительность. " Снижение производительности?

Ваш ответ на вопрос