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


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

предисловие:

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

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

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

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

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

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

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

Что я считаю делать, идя со здравым смыслом,наверное, неправильно подходите:

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

вопросы:

  • каков был бы лучший подход для обеспечения высокой доступности в моей Entity Framework в любое время?
  • в каких случаях Entity Framework снова становится "холодным"? (Перекомпиляция, переработка, перезапуск IIS и т. д.)
5 115

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

чтобы объяснить, когда кэш становится "холодным".

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

  • когда когда-либо кэш должен быть проверен после потенциального изменения, которое делает кэш устаревшим, это может быть тайм-аут или более интеллектуальный (т. е. изменение кэшированный элемент.)
  • при вытеснении элемента кэша алгоритм для этого описан в разделе "алгоритм вытеснения кэша" в статья производительности, которую вы связали, но короче.
    • lfru (наименее часто - недавно используемый) кэш по количеству попаданий и возрасту с ограничением 800 элементов.

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

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

извлекается из вашего ссылке: "При создании представлений они также проверяются. С точки зрения производительности, подавляющее большинство затрат на генерацию представлений на самом деле является проверкой представлений"

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

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

ярлык ...

  1. пропустить всю эту дополнительную работу предварительно сгенерированных представлений
  2. создать контекст объекта
  3. увольте этот сладкий нерелевантный запрос
  4. тогда просто сохраните ссылку на контекст вашего объекта на время процесса (не рекомендуемый.)

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

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