IIS 7.5 Application Warm-Up Module

開發 ASP.NET 應用程式的人多少都碰過這樣的困擾:使用者經常抱怨,每天早上一進辦公室,登入我們的網站時都好慢好慢,要等好久才出現第一個頁面。

回答總是千篇一律:第一個存取網站的人,因為有一些初始化的動作,所以會等比較久。(使用者內心對話:原來最早開始工作的人反而會被懲罰 >_<)


曾考慮寫個排程,每天早上對網站發出 request,讓 Web 應用程式的初始化動作事先完成。但這種方法只能算解了一半,畢竟還有很多種情況會導致 IIS 或 application pool 重新啟動。

現在有更好的選擇:IIS 7.5 Application Warm-Up Module

此模組目前還是 beta 版,我裝完之後試了一下,覺得挺好用,設定也很簡單。

底下是一個小實驗,用來測試這個 Warm-Up module。
  1. 在 IIS 中建立一個應用程式:DemoWeb。編輯此網站應用程式的 Global.asax,在 Application_Start 事件中刻意延遲約五秒鐘,以模擬應用程式初始化的時間:

        void Application_Start(object sender, EventArgs e)
        {
            System.Threading.Thread.Sleep(5000);       
        }
  2. 在 Default.aspx 頁面加一個 HTML Button(注意不是 ASP.NET Button),並撰寫按鈕事件:

        function Button1_onclick() {
            var now = new Date();
            window.location = "http://localhost/DemoWeb/Default.aspx?RequestTime=" +
                now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds();
        }

    這是為了記錄前端頁面發出 request 的時間,方便觀察網頁的處理時間。
  3. 在 Default.aspx 的 Page_Load 事件中輸出時間資訊:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(Request["RequestTime"]))
            {
                Response.Write("發出 Request : " + Request["RequestTime"] + "<BR/>");
                Response.Write("傳回 Response: " + DateTime.Now.ToString("H:m:s"));
            }
        }
註:其實也不用寫那麼多  code 來顯示網頁的處理時間,瀏覽網頁時自己感覺一下就知道快慢了。只是閱讀文章時無法感覺執行時間的差異,明白起見,就多寫了點程式碼,把時間資料秀出來。

先試試看未啟用 warm-up 機制的情形:
  1. 以瀏覽器開啟 http://localhost/DemoWeb/Default.aspx。
  2. 將 DemoWeb 所屬的的應用程式集區回收。
  3. 回到瀏覽器的 Default.aspx 頁面,點一下 Button1,結果顯示如下:

結果顯示,從前端頁面發出 request 開始,到 Default.aspx 頁面處理完畢,中間大概花了六秒的時間。若再按一次頁面上的按鈕,由於是第二次存取,速度會快很多(不到一秒)。

接著啟用 warm-up:
  1. 開啟 IIS 管理員,點選 DemoWeb,會看到中間面板(功能檢視)的 IIS 區塊下有一個「Applciation Warm-Up」圖示:

  2. 雙擊「Applciation Warm-Up」圖示,再點右方「動作」面板的「Add requests」,在新開啟的對話窗中輸入你希望應用程式「熱身」時所欲觸發的 URL(相對路徑):

  3. 以瀏覽器開啟 http://localhost/DemoWeb/Default.aspx。
  4. 將 DemoWeb 所屬的的應用程式集區回收。
  5. 稍等個五秒左右,讓 IIS 自動幫應用程式完成「熱身」。
  6. 回到瀏覽器的 Default.aspx 頁面,點一下 Button1,結果如下:

第一次存取網站時果然變快了!

唯一的問題是......IIS 7.5 only。

沒有留言:

技術提供:Blogger.
回頂端⬆️