簡體   English   中英

為什么ASP頻繁編譯我的觀點?

[英]Why is ASP compiling my views so frequently?

我們有4台服務器負載均衡:

  • 4芯@ 2.6Ghz(E5-2650 v2)
  • 14GB RAM
  • Windows 2012 R2
  • 高性能功率設置
  • IIS 8.5
  • ASP 5.3
  • EF 6.1

它們每個都有一個應用程序池,其中包含一個工作進程和一個網站。 每個服務器都有自己的站點副本(DLL和視圖),在本地磁盤上運行。 我們使用IIS虛擬目錄指向群集文件服務器上的共享以獲取日志文件和常用圖像等(僅限內容)。 應用程序池設置為在空閑時不關閉(間隔為0),並且我們也禁用了每1740分鍾的循環間隔。

我們在所有服務器上安裝了New Relic的.NET代理,通過我們的慢速事務日志,我可以看到許多請求需要15秒左右才能完成。 查看跟蹤,我可以看到對System.Web.Compilation.AssemblyBuilder.Compile()System.Web.Compilation.BuildManager.CompileWebFile()的公共調用。

據我所知或理解,ASP會在第一次請求時編譯這些視圖,並將其緩存(到C:\\ Windows \\ Microsoft.Net中的臨時ASP文件),然后從那里加載后續請求。

我很困惑這種情況經常發生 - 當我訪問這些URL時,TTFB大約是400ms,由於持續加載,我看不到網站“丟失”他們的緩存並需要再次編譯視圖。 這些頁面經常被點擊 - 它是一個電子商務商店,我可以看到它經常發生,並在我們最受歡迎的頁面上:目錄(類別/品牌/性別等)列表和產品詳細信息。

我已針對每個應用程序池設置設置以在回收時記錄事件,並且在我在事件查看器中檢查WAS服務時未記錄任何事件。 我們還安裝了New Relic服務器,並查看過去6小時的數據,我看不到任何服務器上的RAM使用量下降 - 這表明應用程序池的回收。 這真讓我困惑!

我正在考慮將我們的觀點作為發布過程的一部分進行預編譯 - 這真的很有道理。 但感覺就像是在解決這個問題,或者掩蓋一個我認為不應該發生的問題。 我們在發布模式下構建我們的站點,並在所有web.config文件上都有<compilation debug="false" />

任何人都可以想到這個的原因嗎?

這是因為JIT(Just-In-Time)編譯的工作原理。

構建應用程序時,它將轉換為.NET Microsoft中間語言(MSIL)或中間語言(IL)。

在訪問您的應用程序時,公共語言運行庫(CLR)僅將代碼的已執行IL部分轉換為本機指令。

實時編譯過程將IL轉換為本機機器指令,它是CLR的一部分。

簡而言之,當您運行.NET應用程序並且程序調用方法時。 JIT編譯器從元數據中讀取IL並將其編譯為本機指令並運行它。 接下來,當您的程序調用相同的方法時,CLR直接執行本機CPU指令。 此過程為第一個方法調用增加了一些開銷。 您可以使用NGEN預編譯應用程序的其他選項,這通常不建議使用,因為您將失去一些只有JIT可以執行的優化,因為它對底層硬件平台有所了解。 這兩篇文章有更多細節http://geekswithblogs.net/ilich/archive/2013/07/09/.net-compilation-part-1.-just-in-time-compiler.aspxhttps:// msdn。 microsoft.com/en-us/library/ms366723.aspx

您還可以嘗試其他可以幫助您加速應用程序的事情。 您可以使用IIS應用程序預熱模塊如何在IIS 7.5上預熱ASP.NET MVC應用程序? ,實現分布式緩存等,以緩解您的一些應用程序瓶頸。

暫無
暫無

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

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