Первый вызов нашего API всегда очень медленный. Например, ниже показано использование ЦП и время, необходимое для завершения первого вызова:
Первый вызов может занимать до 30 секунд и ест почти 100% процессор. Вызов 2 и 3 занимает 200 мс (как и должно быть). После повторного использования пула приложений он будет делать то же самое с первым вызовом.
Я немного читал об "разминке" IIS и делал следующее, но ничего не изменилось:
Инициализация приложений IIS 8:
У меня есть следующий набор в IIS:
- Установите Режим запуска на AlwaysRunning:
- Установите Тайм-аут перезаписи на 0:
- Установите Idle Time-out на 0:
- Установите Preload Enabled на true на сайте:
Я фактически устанавливаю их в коде в RoleEntryPoint.OnStart()
.
using (var serverManager = new ServerManager())
{
serverManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero;
foreach (var application in serverManager.Sites.SelectMany(x => x.Applications))
{
application["preloadEnabled"] = true;
}
foreach (var applicationPool in serverManager.ApplicationPools)
{
applicationPool.AutoStart = true;
applicationPool["startMode"] = "AlwaysRunning";
applicationPool.ProcessModel.IdleTimeout = TimeSpan.Zero;
applicationPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;
}
serverManager.CommitChanges();
}
Я почти уверен, что Entity Framework может быть виновником:
-
Мы создаем модели из примерно 100 таблиц в "дизайнере" модели EDMX.
-
Мы генерируем предварительно скомпилированные представления, созданные EF Power Tools.
-
В
Application_Start()
выполняется инициализация:using (var context = new MyContext()) { context.Database.Initialize(false); }
У меня нет этих проблем с инициализацией при отладке.
Используется следующая технология:
- .NET 4.5.1
- ASP.NET Web Api 2
- Entity Framework 6.1.1
- IIS 8 (Azure Web Role)
- Unity 3.5
Может ли кто-нибудь предоставить мне какие-либо другие идеи или предложения?