在為客戶進行客製化 簡訊應用系統 專案時,網站採用ASP.NET開發,掛載在IIS上,於是會遇到一個常見的狀況:第一個登入系統的人要等比較久的時間才能看到回應的網頁,IIS 8之後也提供了預先載入的設定,依照網路上查到的設定方式設定後,卻依然收到客戶反映第一個登入的使用者回應時間過久的問題。本篇文章則是探討IIS上的預先載入相關設定與適用情況。
首先介紹IIS上與預先載入有關的設定,分成三大類,第一類在安裝IIS功能時,要勾選『網頁伺服器』→『應用程式開發』→『應用程式初始化』
接下來點選網站或應用程式所套用的應用程式集區,於動作方格點選『進階設定…』
將『啟動模式』設為AlwaysRunning
再點選網站或應用程式,於動作方格點選『進階設定…』
註1:易犯錯誤:IIS安裝時未勾選『應用程式初始化』,此時介面上仍可設定應用程式集區的『啟動模式』為AlwaysRunning與網站或應用程式的『預先載入已啟用』,但進行測試後發現並沒有達到預先載入的效果。
第二類設定是點選網站或應用程式的『功能檢視』頁簽的『設定編輯器』
將『區段』選到system.webServer/applicationInitialization,並確認『來源』是要設定預先載入的網站或應用程式.Web.Config後,將『doAppInitAfterRestart』設為True
接下來點選『(集合)』的『…』按鈕,設定程式初始化時的Request路徑於參數『initializationPage』內
第三類設定則又回到應用程式集區的『進階設定…』,將『閒置逾時動作』設為Suspend
IIS設定分成三類,測試情境也分成三種,第一個情境是將應用程式集區回收後等數秒鐘,再測試使用者登入網站,網頁回應的時間。
這邊使用Console指令將應用程式集區回收:
%windir%\system32\inetsrv\appcmd\appcmd recycle apppool /apppool.name:[應用程式集區名稱]
網頁回應的時間則是抓IIS Log(C:\inetpub\logs\LogFiles\W3SVC?\*.log)的time-taken時間(單位為毫秒)
第二個情境是將IIS重啟後等數秒鐘,再測試使用者登入網站,網頁回應的時間。
在此也使用Console指令將IIS重啟:iisreset
第三個情境則是使用者登入網站後,不再操作,直到超過應用程式集區的閒置逾時(分)時間(預設值是20分鐘),應用程式集區被IIS回收後等數秒鐘,再測試使用者登入網站,網頁回應的時間。
註2:驗證應用程式集區是否因逾時被回收,可看事件檢視器的系統,來源WAS,事件識別碼為5186。
註3:只有當應用程式集區的閒置逾時時間設成Terminate,才會看到事件5186發生。
下列是將三類設定的搭配組合加上三種測試情境的結果:
啟動為AlwaysRunning且預先載入已啟用 | 啟用doAppInintAfterRestart | 閒置逾時時間為Suspend | 回應時間(毫秒) | |
AppPool回收 | V | V | V | 46 |
IISReset | V | V | V | 31 |
閒置回收 | V | V | V | 1625 |
AppPool回收 | V | V | X | 62 |
IISReset | V | V | X | 31 |
閒置回收 | V | V | X | 46 |
AppPool回收 | V | X | V | 46 |
IISReset | V | X | V | 62 |
閒置回收 | V | X | V | 109 |
AppPool回收 | V | X | X | 31 |
IISReset | V | X | X | 15 |
閒置回收 | V | X | X | 78 |
AppPool回收 | X | V | V | 3921 |
IISReset | X | V | V | 4609 |
閒置回收 | X | V | V | 94 |
AppPool回收 | X | V | X | 3890 |
IISReset | X | V | X | 4578 |
閒置回收 | X | V | X | 4172 |
AppPool回收 | X | X | V | 24983 |
IISReset | X | X | V | 4250 |
閒置回收 | X | X | V | 93 |
結論:
- 要達到使用者在無論哪種原因導致應用程式集區被回收,都可以快速拿到網站回應結果,採用第一類設定即可,但要記得檢查IIS有安裝『應用程式初始化』
- 若不打算設定預先載入,又不希望太常發生使用者回應時間過久的問題,可採用第三類設定,這樣只有IIS剛重啟時,會比較久,平常應用程式集區並不會被頻繁回收。
- 目前尚未找到第二類設定在何時間點可以發揮作用。
Ref: https://blogs.msdn.microsoft.com/msdntaiwan/2014/04/15/iis-asp-net-iis/
Ref: https://kknews.cc/zh-tw/tech/p496byj.html
Ref: http://kreelbits.blogspot.tw/2015/07/iis-application-initialization-quick.html