【发布时间】:2014-10-02 12:36:32
【问题描述】:
第一次调用我们的 API 总是非常慢。例如,下面演示了第一次调用完成所用的 CPU 使用率和时间:
第一次调用最多可能需要 30 秒,并且占用几乎 100% 的 CPU。调用 2 和 3 需要 200 毫秒(应该如此)。回收应用程序池后,它会和第一次调用一样。
我已经阅读了一些关于 IIS“预热”的内容并做了以下操作,但没有任何改变:
IIS 8 Application Initialization 已安装:
我在 IIS 中有以下设置:
- 将启动模式设置为AlwaysRunning:
- 将回收超时设置为0:
- 将 空闲超时 设置为 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 可能是罪魁祸首:
我们在 EDMX 模型“设计器”中从大约 100 个表生成模型。
我们正在生成由 EF Power Tools 生成的预编译视图。
-
以下初始化正在
Application_Start()中运行:using (var context = new MyContext()) { context.Database.Initialize(false); }
我在调试时没有这些“初始化”问题。
正在使用以下技术:
- .NET 4.5.1
- ASP.NET Web API 2
- 实体框架 6.1.1
- IIS 8(Azure Web 角色)
- Unity 3.5
谁能给我其他的想法或建议?
【问题讨论】:
-
您是否在
applicationHost.config文件中为 Web 应用程序设置了preloadEnabled="true"? -
@afrazier:是的,启动代码设置为 true。
-
你注释掉EF初始化代码看是否会出现秒杀?
-
请将设置添加到 .config 文件中,而不是通过代码进行设置。要通过代码设置它们,您需要运行应用程序。你宁愿从一开始就让它们具有正确的设置。附加说明:您是否尝试过记录分层的不同步骤,以便在服务器重新启动时运行它们?
-
@davenewza 您的代码应该这样做。当您调用
Initialize时,将执行数据库初始化和播种。但是没有文档保证模型(视图)被加载到内存中。也许(我只是假设)模型在需要时才加载。因此,您还可以在 DB 初始化程序中运行一个简单的查询来确保发生这种情况。
标签: entity-framework iis entity-framework-6 asp.net-web-api2 iis-8