2015-07-20 42 views
0

如您所知,更新IIS(v8)站點的bin文件夾會導致服務下一個請求時出現延遲。在一臺服務器上託管的小型應用程序中,這個應用程序持續約20秒。改善IIS .NET MVC站點中DLL更改後的首次請求時間

在每秒鐘都有請求進入的現場網站上,自動升溫並沒有什麼區別。

導致這種延遲的瓶頸是什麼,以及有哪些策略可以將其最小化?我的想法到目前爲止:

  1. 增加服務器的CPU功率或RAM/SSD的速度等。但哪個?
  2. 將項目拆分成許多較小的DLL,以便重新加載的量更小 - 這是否可行?
  3. 在不同文件夾中的服務器上有兩個物理版本。讓應用程序指向舊版本,在另一個版本中更新DLL,執行第一個請求,然後切換應用程序以指向更新的文件夾。但是,切換物理位置也會造成這種延遲?

想法感激。

+0

我想你應該嘗試[預發佈之前編譯你的項目](http://stackoverflow.com/questions/8038053/publishing-pre-compiled-asp-net-mvc-vs2010)。 –

+0

嗯所以你認爲延遲是由重新編譯視圖引起的?我發現如果我更新視圖文件,沒有(或最小的)延遲。這只是當我更新DLL – rwalter

+0

,但你也可以根據你的平臺預編譯DLL,我gess –

回答

1

當您發佈應用程序(或更改bin項)時,它將創建w3wp.exe進程的新實例。這是存儲應用程序內存的Web進程(保持簡單)。如果你發佈你正在創建一個新的實例,而舊的正在被破壞。

所有會話都將丟失。

例如,每次發佈網站時,都會對web.config進行更改。這將導致應用程序卸載並IIS進行回收。

原因:

  • 的Web.config變化
  • bin文件夾中的內容變化
  • 手冊IIS應用程序了 池回收

你點1 & 2將沒有什麼區別,您的問題什麼都是如此。您的第三點將再次導致應用程序池回收,這會造成延遲。

解決方法是使用負載平衡的服務器環境。然後,您可以更新一臺服務器,同時指向另一臺服務器,在更新後的版本上執行一些請求,以便JIT將用戶交換到該服務器,然後在第二臺服務器上執行相同的操作。

+0

謝謝。很有用。我認爲你在最後一段中指的是第3點的含義:通過並行運行兩個版本(在不同的應用程序池中)來模擬負載平衡器,然後以某種方式從一個版本切換到另一個一旦更新。但你如何做到這一點?通過編輯綁定?似乎有風險... 我使用狀態會話服務器,所以我不擔心失去會話。 – rwalter

+0

這取決於您的基礎設施。我不能回答這個問題,如果你有一個物理負載平衡器,它會有不同的虛擬。你想要的是一個'暫存'環境,你可以進行更改然後切換。然後,「舊」環境成爲你的舞臺。你可以通過編輯綁定來完成。 –