如何讓 .NET 的網站 或 WebService 第一次啟動變快 ver 2014 ( IIS 啟動模式 )
之前在做專案輔導的時候,很多朋友和團隊都有 ASP.NET 第一次載入很慢的困擾。
有稍微了解 ASP.NET 的生命週期和運作機制的朋友知道, ASP.NET 基本上是採取動態編譯的方式來執行。
參考
- IIS 7.0 的 ASP.NET 應用程式生命週期概觀
http://msdn.microsoft.com/zh-tw/library/bb470252(v=vs.100).aspx- ASP.NET 網頁生命週期概觀
http://msdn.microsoft.com/zh-tw/library/ms178472(v=vs.100).aspx- 認識 ASP.NET 動態編譯
http://msdn.microsoft.com/zh-tw/library/ms366723(v=vs.100).aspx
當問到大家怎麼解決這個問題時,除了少數會做 Precompiler 或是 用排程的方式強制執行外,也有很多是採取放牛吃草的狀態。
就算用了先行編譯但過一段時間後再連結網站,它還是會花比較多的時間載入。那是因為沒有人使用的情況下 IIS 進行了「資源釋放」的動作,這個是非常必要而且也是確保資源會被回收的動作。 ( 避免 memory leak 發生 )
所以,自然就有朋友在 IIS 上設定排程的方式強制重新載入,但這個做法卻會有非常大的風險,因為您無法得知現在系統裡面是否有人正在執行?若真的有人在裡面的話,裡面的人就會被強制登出剛剛所有做的作業全部都消失的風險。
那麼正確的做法應該要怎麼做?自從 ASP.NET v4.0 以後只要簡單的設定就可以搞定這個問題,讓您的系統日後不用再擔心第一次很慢的問題 。
基本要滿足幾個條件
一、.NET CLR 必須是 4 以上的版本
二、pool 必須要是「整合模式」 ( 傳統的不行,因為 isapi 的限制 )
三、在 pool 的進階設定中的「啟動模式」要改成 AlwaysRunning
四、Web 站台的進階設定中「預先載入已啟用 PreloadEnable」必須是 True ( 感謝 Charles 提醒 )
就可以了 是不是很簡單
另外,Web Service 或是 WCF 這種服務類的更適合這個做法喔! 請務必要開啟來試試看,連接服務的時候就不會覺得第一次特別久。
同場加映實際的效能改善比較
想說都設定好了,還是用 IE 11 的網路效能分析來跑一下結果
沒有設定的時候,第一次要 7 秒
有設定的時候,第一次不到 1 秒 ( 不用懷疑,真的是第一次 )
當然第二次載入就更快了
詳細的部分可以參考 MSDN
http://msdn.microsoft.com/zh-tw/library/ee677261(v=azure.10).aspx