我們有4臺服務器進行負載平衡:爲什麼ASP如此頻繁地編譯我的視圖?
- 4核2.6GHz的@(E5-2650 V2)
- 14GB RAM
- 的Windows 2012 R2
- 高性能功率設置
- IIS 8.5
- ASP 5.3
- EF 6.1
它們每個都有一個應用程序池,只有一個工作進程和一個網站。每個服務器都有自己的本地副本(DLLs &視圖),在本地磁盤上運行。我們使用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" />
。
任何人都可以想到這個的任何原因?
您是如何得出System.Web.Compilation.AssemblyBuilder.Compile()和System.Web.Compilation.BuildManager.CompileWebFile()消耗大部分15秒延遲的結論的?只是想知道延遲是否在別的地方。您是否試圖捕獲操作方法收到請求後花費了多少時間?發起http請求的客戶端與服務器之間的網絡延遲如何? – Vinod
我正在使用New Relic來查看'slow transactions',並且我們所有的慢事務都包含對這些方法的調用,並且佔用了15%的頁面請求。當我在網站上開發時,我看到了類似的效果 - 當我重建項目並重新加載頁面時,渲染需要很長時間(擱置應用程序啓動時間)。如果我然後訪問另一個控制器上的頁面,那麼顯示的「減速」與再次刷新頁面(而視圖是第一次渲染) –
不試圖偏離實際主題,但大多數應用程序最近一直在使用asp.net mvc,我正在將他們推向單頁應用程序架構。可能不是純粹的SPA,我仍然有多個觀點,但很少。這種設計可以幫助我避免您面臨的問題。它在客戶端引入了複雜性,但更好的用戶體驗。 – Vinod