У меня очень странная проблема с веб-приложением Azure, и я очень разочарован этим.
Мы считаем, что наше приложение очень быстрое и отзывчивое при его использовании, однако, если мы не используем его в течение примерно десяти минут, оно имеет очень холодный старт (~ 10-20 секунд). Этот холодный старт происходит только тогда, когда он включает базу данных. Когда это немного похоже на то, когда мы выпускаем веб-приложение.
Наши попытки
Используя Application Insights внутри Azure, мы настраиваем этот пинг каждые 5 минут:

Выбросы всегда вызваны моими развертываниями (сейчас я не использую слоты развертывания). Однако эта страница входа не вызывает нашу базу данных, поэтому мы не видим «холодного» запуска в этих данных.
Настройка приложения должна быть твердой. Наше веб-приложение размещено в Северной Европе с Always on
:

Мы просто перенесли всю настройку в новую группу ресурсов / план обслуживания приложения, чтобы убедиться, что наша проблема связана с другими нашими приложениями. Новый план обслуживания приложения - Standard 1 small
, что не должно быть проблемой. Глядя на наше потребление, я не волнуюсь и, возможно, даже мог бы попробовать меньшую услугу, которую я сделаю после решения нашей проблемы:

Наша база данных SQL также размещена в Северной Европе (проверенные местоположения миллиард раз, потому что я делал эту ошибку раньше).
Как и в случае со службой приложений, мы выбрали «слишком большое» оборудование, чтобы убедиться, что оно не вызывает проблемы (стандартные DTU S0: 10). Использование смехотворно мало:

Мы используем непрерывное развертывание (Deployment options
внутри меню Azure), но, глядя на развертывания, оно не должно постоянно развертывать что-либо:

Разочарование приходит в приложение супер реагировать, когда оно работает. Когда «горячая» страница загружается за считанные секунды, как показывает мое среднее время ответа в нашем веб-приложении:

Но эти цифры просто неверны, когда мы (или наши пользователи!) Используем наше приложение. Здесь мы испытываем очень часто + 10-20 секунд загрузки в первый раз.
У кого-нибудь есть идея? Есть намеки? Ты не представляешь, как я буду благодарен.
РЕДАКТИРОВАТЬ И ОБНОВИТЬ 1:
Я решил настроить еще несколько тестов. Теперь мне удалось получить реальные данные, показывающие нашу проблему, позвонив на другую страницу. По иронии судьбы эта страница НЕ вызывает базу данных, поэтому, хотя я и думал, что это проблема с базой данных, похоже, это не так. Смотрите вызов здесь (тренд продолжается +24 часа).
Странно, насколько стабильно оно ровно ~ 10 секунд. И тенденция, кажется, не каждые 10-20 минут, а ближе к каждые 5 минут - с точно таким же интервалом между ними:

РЕДАКТИРОВАТЬ И ОБНОВИТЬ 2:
Я копал еще немного. Оказывается, есть пара очень интересных выводов: «медленные» 11-секундные вызовы из редактирования 1, только из восточной части США и из одной конечной точки (http://prntscr.com/jcv69w), и
Самое интересное, что я нашел, это следующее:
Само приложение НЕ имеет никакого кэширования. Я использую Entity Framework, который, как я предполагаю, использует некоторое кеширование, но это все.
Я вошел в наше приложение и переключился в Chrome. Я обнаружил, что страницы, которые я уже посетил, показываются мгновенно (с данными из БД), но если я открою новую страницу, она будет загружаться медленно. Казалось, что некоторые объекты кэшируются при первом открытии страницы.
Затем я попытался открыть приложение в новом браузере. Если бы я открыл страницу, которую я ранее открыл в Chrome, она открылась бы мгновенно. Если я открою новую страницу, на которую раньше не нажимал, она загрузилась бы ~ 10 секунд.
Мое лучшее предположение сейчас состоит в том, что Entity Framework, который я использую, по какой-то причине создает проблемы.
РЕДАКТИРОВАТЬ 3:
Только что добавил награду и настраивает много логов. Я добавил MiniProfiler, но не могу заставить его работать на производстве (отображается только для локальных запросов).
Я также добавил запись в global.asax для Application_Start
и Application_BeginRequest
и Application_EndRequest
, чтобы увидеть некоторые из них и статус там. Скоро будет обновлено с выводами.
РЕДАКТИРОВАТЬ 4:
Так что теперь у меня есть первые интересные цифры. Приложение не перерабатывается. Application_Start
вызывается только один раз.
Я могу увидеть разницу во времени, войдя в систему EndRequest
и BeginRequest
. Я вижу, что есть несколько звонков, которые занимают более +15 секунд между этими двумя ... Но когда сайт нагревается, это занимает ~ 0,5-2 секунды в зависимости от страницы. Так что между началом и концом запроса происходит нечто очень странное. Отладка дальше!
РЕДАКТИРОВАТЬ 5:
Получил MiniProfiler для работы. Вот пример медленной загрузки (~ 15 секунд):

Мой следующий шаг - добавление отслеживания Entity Framework и еще несколько строк для линейных вызовов. Я получаю свои деньги в базе данных!
РЕДАКТИРОВАТЬ 6:
Окидоки, я был не прав. Это медленный метод рендеринга, а не база данных! Я не знаю, как отладить это ... В Google!

РЕДАКТИРОВАТЬ 7:
Время для другого обновления. Статус: ничего не решено.
Итак, я много чего перепробовал:
1) Я попытался отключить все типы кэширования ( Запретить кэширование в ASP.NET MVC для определенных действий с использованием атрибута ), и у меня такое же поведение. Первая загрузка? Медленный. Следующая загрузка? Быстро. Подождите 5-10 минут, такое же поведение не решено.
2) У меня были некоторые нестандартные вещи в моем файле startup.auth с 5-минутной задержкой. Удалены. Не проблема.
3) Я использовал собственный атрибут для авторизации. Я удалил это.
4) Я обновил свою реализацию Entity Framework, чтобы она работала в соответствии с запросом
Я очень расстроен. Мой следующий шаг:
A) Попробуйте сделать 5-10 версий одной и той же страницы (без _layout, с макетом, с базой данных, без базы данных, с внедрением зависимостей, без ... всех этих вещей), чтобы посмотреть, смогу ли я найти шаблон.
B) Попробуйте переместить хостинг на виртуальную машину, чтобы посмотреть, решит ли она проблему
РЕДАКТИРОВАТЬ 8 - ДОБАВЛЕНО НОВОЙ РЕЛИКОЙ:
Я добавил новую реликвию. Вот две очень страшные вещи (я нашел и воспроизвел ошибку!):

Что касается внешнего интерфейса (часть браузера New Relic), то между двумя запусками не хватает ~ 15 с:
http://prntscr.com/jevgeg против http://prntscr.com/jevgix, между которыми нет ничего.