ASP.NET Web Api 2/EF6首先调用初始化性能

Dav*_*New 28 iis entity-framework iis-8 entity-framework-6 asp.net-web-api2

第一次调用我们的API总是非常慢.例如,下面演示了第一次调用完成所需的CPU使用率和时间:

CPU使用率

第一次通话最多可能需要30秒,并且几乎可以占用100%的CPU.呼叫2和3需要200ms(他们应该这样做).在回收应用程序池之后,它将在第一次调用时执行相同的操作.

我已经阅读了一些有关IIS"热身"的内容,并完成了以下操作,但没有任何改变:

IIS 8应用程序初始化已安装:

IIS 8应用程序初始化

我在IIS中有以下设置:

  • Start Mode设置为AlwaysRunning:

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();
}
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定实体框架可能是罪魁祸首:

  • 我们在EDMX模型"设计师"中生成大约100个表格的模型.

  • 我们正在生成由EF Power Tools 生成的预编译视图.

  • 运行以下初始化Application_Start():

    using (var context = new MyContext())
    {
        context.Database.Initialize(false);
    }
    
    Run Code Online (Sandbox Code Playgroud)

调试时我没有这些"初始化"问题.

正在使用以下技术:

  • .NET 4.5.1
  • ASP.NET Web Api 2
  • 实体框架6.1.1
  • IIS 8(Azure Web角色)
  • Unity 3.5

任何人都可以向我提供任何其他想法或建议吗?

K. *_*ins 5

不确定是否有人已经解决了这个问题,但我已经了解了Entity Framework初始启动时出现的一些性能问题.Julie Lerman在她关于实体框架的Pluralsight课程中对此进行了讨论,并且在下面的文章摘录中也提到了这一点:

性能最大的拖累之一是在应用程序进程中首次使用上下文所涉及的启动时间.但是,您可以做很多事情来改善启动时间.希望您已经从我自己的写作或其他资源中学到了这些技巧,例如关于bit.ly/3D6AiC的性能考虑的MSDN文档.

通常会妨碍性能的启动步骤是视图生成映射视图,其中EF创建相关的SQL来查询模型中的每个实体集.当您的应用程序运行时,这些视图会被利用,因此对于某些查询,EF不必动态计算SQL.无论您是使用EF Designer还是使用Code First创建模型,都会生成视图生成.您可以预先生成这些视图并将它们编译到应用程序中以节省时间. http://msdn.microsoft.com/en-us/magazine/dn532202.aspx

在这里,似乎她不只是谈论'初始加载',而是实际首次使用上下文.我想快速搜索Julie Lerman和Entity Framework性能问题.在初次调用Web API时,我注意到了类似的缓慢.第一次之后的每次通话都要快得多.我个人没有发现它太可怕,所以我忽略了它(现在).但是我觉得有趣的是它在调试模式下不会发生.对不起,如果您已经探索过这些选项,但我希望这会有所帮助.