簡體   English   中英

ASP.NET Web Api 2 / EF6首次調用的初始化性能

[英]ASP.NET Web Api 2 / EF6 first call initialization performance

首次調用我們的API總是非常緩慢。 例如,下面的示例演示了第一次調用完成時的CPU使用率和時間:

CPU使用率

第一次通話最多可能需要30秒,並且會消耗近100%的CPU。 通話2和通話3需要200毫秒(應有的時間)。 回收應用程序池后,它將在第一次調用時執行相同的操作。

我已經閱讀了一些有關IIS“預熱”的信息,並進行了以下操作,但沒有任何變化:

IIS 8應用程序初始化已安裝:

IIS 8應用程序初始化

我在IIS中進行了以下設置:

  • 開始模式設置為AlwaysRunning

始終運行

  • 將“ 回收超時”設置為0:

回收超時

  • 空閑超時設置為0:

空閑超時

  • 在站點上將“ 啟用預加載”設置為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();
}

我幾乎可以肯定,實體框架可能是罪魁禍首:

  • 我們正在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

誰能提供我其他想法或建議?

不確定是否有人已經解決了這個問題,但是我已經了解到實體框架最初啟動時出現的一些性能問題。 朱莉·勒曼(Julie Lerman)在其關於實體框架的Pluralsight課程中對此進行了討論,並且在以下Microsoft的文章摘錄中也提到了這一點:

性能上最大的拖累之一是在應用程序過程中首次使用上下文所涉及的啟動時間。 但是,您可以做很多事情來縮短啟動時間。 希望您已經從我自己的著作或其他資源中學到了這些技巧,例如bit.ly/3D6AiC上有關性能注意事項的MSDN文檔。

通常會影響性能的啟動步驟是映射視圖的視圖生成,其中EF創建相關的SQL以查詢模型中的每個實體集。 這些視圖會在您的應用程序運行時得到利用,因此對於某些查詢,EF不必動態制定SQL。 無論您是使用EF Designer還是使用Code First創建模型,都會發生視圖生成。 您可以預先生成這些視圖,然后將它們編譯到應用程序中以節省時間。 http://msdn.microsoft.com/zh-CN/magazine/dn532202.aspx

在這里,她似乎不僅在談論“初始負載”,而且還討論了上下文的實際首次使用。 我想快速查找Julie Lerman和Entity Framework性能問題。 初始調用Web API時,我注意到類似的緩慢情況。 第一次通話之后的每個通話速度都明顯更快。 我個人還沒有發現它太可怕,所以我暫時忽略了它。 但是我確實發現有趣的是它不會在調試模式下發生。 抱歉,如果您已經探索過這些選項,但是希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM