Application Domain 與 Application Pool 的差異

最近同事問到修改 IIS 上站台的 log path 會不會引發重啟,雖然針對同事的問題有九成把握,但對於實際運作細節卻有許多疑問,所以想趁著這個機會順便理解 IIS recycle 的流程,一看發現我對 Application Domain 與 Application Pool 的差異沒有十足把握,趁著整理內容來釐清一些觀念

IIS 重啟可能由兩個部份觸發:

  1. Application Domain recycles
  2. Application Pool recycles

關於 Application Domain 與 Application Pool

兩個都是用來隔離執行程式、避免相互干擾,差在實作的方式不同

  1. Application Domain (AppDomain)

    • 透過 CLR 來隔離使用在同個 AppPool 下不同 web site 間的交互影響
    • 是 .NET 中的術語
  2. Application Pool (AppPool)

    • 透過 process 來隔離使用不同 AppPool 的每個 web site
    • 是 IIS 中的術語
    • 一個 AppPool 會執行在一個或多個 w3wp.exe worker process 下

      可以啟用多個 worker prcess

    • 允許多個 web site (AppDomain) 同時在一個 AppPool 中執行,但建議將每個 application (web site) 獨立使用自己的 application pool 較好

    • 可以指定不同 .NET CLR 版本

  3. 兩者關係

    appdomain_apppool

Application Domain 與 Application Pool 回收

  1. Application Domain

    • 造成 Application Domain 回收的原因

      • 修改 web.configGlobal.asax
      • 修改 bin 資料夾內容
      • 修改 虛擬目錄 的實體路徑
      • 刪除 application (web site) 的子資料夾
      • 動態重新編譯 (aspxascxasax) 數量超出設定值 (預設值: 15)

        可以經由 machine.configweb.config<compilation numRecompilesBeforeAppRestart=/> 來調整設定

    • Application Domain 回收的影響

      • 效能衝擊

        所有組件會從記憶體 卸載、重新載入並重新即時編譯

      • 所有 in-process 變數的內容都會消失

        包括 session, application, cache 這些預設儲存在記憶體中的內容

  2. Application Pool

    • 造成 Application Pool 回收的原因

      • 可設定回收條件
        • 定期時間間隔 (預設 1740 分)
        • 固定 request 數量 (預設 0 : 無限)
        • 指定時間 (預設 空 array: 未指定回收時間)
        • worker process 使用虛擬記憶體用量 (預設 0: 無限)
        • worker process 使用私有記憶體用量(預設 0: 無限)
      • 閒置時間 (預設 20 分)
      • 修改設定

        預設情況只有修改 Application Pool 會觸發 Application Pool 回收,可以透過修改 Disable Recycling for Configuration Changes 來避免,但如此一來想套用新設定則需自行手動重啟

    • Application Pool 回收的影響

      • 所有 in-process 變數的內容都會消失

        包括 session, application, cache 這些預設儲存在記憶體中的內容

    • 預設 Application Pool 執行回收時會先另外啟一個 process ,確定可對外提供服務才將 task 移過去並 kill 原 process 1apppoolrecycle

心得

雖然看了一些介紹與說明文件、大致理解了兩者差異,但還是對於設計理念有些不清楚:

  1. AppPool 的存在只是用來讓子資料夾可以使用不同 .NET Framework 嗎?

    不能直接賦于 AppDomain 這個能力就好嗎

  2. 為了批次管理多個 website (AppDomain) ?

    best practice 又說一個 website 對應一個 Application Pool

內容好多,愈看愈覺得自己還有好多東西不懂,真的學不完呀

參考資訊

  1. Application vs. AppDomain
  2. IIS Application Domain and Pool Recycling
  3. IIS Application Pool
  4. Application Pools
  5. Difference between Application Pool and Application Domain