共用方式為


Windows 程序啟動服務(WAS)的功能

作者 :托馬斯·德姆爾

IIS 7 的 Windows 程序啟動服務(WAS)是提供網頁應用程式與網路服務流程模型與配置功能的關鍵元件。 WAS 的主要任務是管理應用程式池。 應用程式池是代表 URL 群組的主機環境的配置容器。

當 HTTP 用戶端請求 URL 時,HTTP.SYS 會將該請求映射到應用程式池請求佇列。 應用程式池請求佇列的 WAS 會產生一個工作程序,該工作程序執行發送回應所需的程式碼。 WAS 的主要任務之一是管理其產生的工作程序,也就是說,WAS 監控其健康狀態,必要時回收,並確保它們不會消耗超過對應 AppPool 配置中指定的資源。 WAS 同時也是執行時與狀態資料的仲裁者與收集器,例如效能計數器、站點與應用池狀態。

架構圖

IIS 7.0 架構

製程模型特性

支援一萬個以上網站在同一台實體機器上架設,是現今大規模主機環境的核心需求。 這些網站上運行的程式碼通常沒有經過充分測試,甚至根本沒有測試過。 為支援這些需求,WAS 需要提供強大的流程模型與高效的資源管理。

高效資源管理

隨選啟動

像是 RAM 和 CPU 這類資源在多租戶情境下都很稀缺。 WAS 只有在收到特定網站或網頁應用程式的請求時,才會啟動 IIS 工作者程序。

閒置超時

由於資源通常稀缺,WAS 可以根據可設定的閒置逾時來關閉網頁應用程式。

健康監測

為了確保系統的健康,WAS 會監控它所啟動的工作程序。 健康訊息會定期發送給每個執行中的工作程序。 如果 worker 程序在可設定的時間間隔內沒有回應,該 worker 程序將會被回收或終止。 如此一來,透過重新啟動工作程序,未被偵測到的死結就能自動修復。

啟動上限

快速失敗保護功能的一部分是啟動限制。 如果工作程序在可設定的啟動限制內未回報給 WAS,該程序會被終止,Rapid-Fail-Protection 計數器會被增加。 應用程式池會停止,也就是說,如果 Rapid-Fail-Protection 計數器在可設定的時間限制內達到可設定的限制,重新啟動工作程序將不再嘗試。 這可避免工作程序在啟動時停滯或當機的情況。

關機限制

工作程序也必須在可設定的限制下關閉。 如果在此時間內沒有關閉,WAS 將終止工作進程。 這可防止因程序在關機階段卡住而導致資源過度使用。 額外的關機設定允許在關機未在指定時間內完成時啟動可執行檔案(例如除錯器)。

CPU 親和力

設定允許 WAS 啟動與一個或多個 CPU 相關的工作程序。 這可防止租戶共用同一台實體機器時互相干擾。

用戶資料

WAS 可以啟動工作程序,無論是否載入使用者設定檔。

安全性

應用程式池身份

IIS 工作程序可作為自訂帳號、內建帳號(LocalService、LocalSystem、NetworkService)或應用程式池身份(預設)執行。 建議使用應用程式池身份,因為它不需要密碼管理,且應用程式池身份本身就遵循最小權限原則。 內建帳號也不需要密碼管理。 若使用自訂使用者身份,密碼會自動加密。 透過在多台機器間共享配置加密金鑰,設定設定可複製到多台機器。

工作對象特徵

工作物件允許管理員限制工作程序在特定 CPU 限制內。 若超過 CPU 限制,會採取可設定的操作。 工作物件也會確保由工作程序產生的程序被終止。

配置隔離與安全性

在 WAS 啟動應用程式池及其工作程序之前,會為該應用池產生一個獨特的組態檔案。 應用程式池也有設定,能以獨特身份執行應用程式池。 不過即使使用相同的身份,隔離仍可達成。 WAS 為每個應用程式池建立唯一的安全識別碼(SID)。 應用程式池的組態檔案會以這個獨特的 SID 來保護。 這確保應用程式池的設定檔只能由管理員及應用程式池本身讀取。 甚至檔案權限也能透過這個獨特的 SID 來設定。

診斷和監控

事件記錄

有關無效設定、回收、啟動或關閉工作程序的事件會回報至系統事件日誌。

目前執行中的請求

WAS 提供執行時與狀態控制介面,允許腳本與工具查詢特定工作程序目前執行中的請求。 這對於尋找無回應或需要很長時間完成的請求非常有用。

效能計數器

所有 IIS 績效計數器都會透過 WAS 轉交。 WAS 收集這些效能計數器是因為 IIS 計數器是基於站點的,且網頁應用程式可以存在於不同的應用程式池中。

回收

回收允許在不因停機而遺失任何請求的情況下,刷新工作流程。 這是透過一種稱為「重疊回收」的功能來完成的。

重疊回收

WAS 藉由與仍在處理請求的舊工作程序並行地生成一個新的工作程序來實現。 一旦新的 worker 程序啟動,它會開始從請求佇列中接收請求,而舊的 worker 程序則由 WAN 指示停止接收請求。 當舊的工作程序完成所有執行請求後,它就會關閉。 這種特性稱為「重疊回收」。 它確保在重新啟動過程中不會丟失任何請求。

回收配置

回收參數可在 IIS 設定系統中設定。

定期回收

客戶可能希望依照固定的時間表回收他們的應用程式。 透過設定設定,回收可以定期排程,例如每 4 小時一次、每天凌晨 1 點等。

根據記憶體消耗進行回收

應用程式可能會隨時間洩漏記憶體。 WAS 可以監控每個工作程序的記憶體使用量,確保沒有工作程序使用超過其預先設定的限制。 達到設定的虛擬或私有記憶體閾值時,會觸發工作程序的回收。

根據請求數量進行回收

回收也可以根據特定工作程序處理的請求數量來設定。

客製化回收

自訂程式碼可以自訂健康統計,並透過 API 呼叫 WAS 執行時與狀態 API 觸發回收。

流程孤兒化

有些錯誤只會在生產環境中發生。 終止工作程序可確保系統的運行時間,但針對這些錯誤的故障排除會變得困難,例如,當失敗的工作程序需要進行錯誤排查和除錯時。 WAS 的孤立功能允許工作程序被重啟,而不會終止失敗的工作程序。 現在可以附加除錯器。 附加的進程孤立設定允許在發生孤立時執行一個進程(例如調試器)。

應用程式池狀態管理

應用程式集區可以透過公開的 API 來停止、回收或啟動,例如,當必須將應用程式下線,或需要根據不同於 applicationhost.config 檔案中可配置的參數進行回收時。

其他WAS功能

Load-Balancer 功能

HTTP.SYS 仍然會在網路上監聽,如果應用程式池沒有接收請求,會回傳 500 HTTP 錯誤訊息。 這會造成問題,因為對於 Level 5 負載平衡器(TCP/IP),500 HTTP 錯誤看起來就像是有效的 TCP/IP 連線。 WAS 設定可以讓HTTP.SYS拒絕連線,而非直接傳送 HTTP 回應。

WAS 可設定以下設定啟動工作程序:

WoW64 支援

WAS 可以啟動 32 位元或 64 位元的工作程序。

.NET Framework 預載

WAS 可以設定為預先載入特定版本的 .NET Framework。 這能讓版本衝突的故障排除變得容易許多。

網路花園

網路花園是指由多個工作程序運行的應用程式池。 請求會以循環機制方式分配給這些工作者程序實例。

WAS 多協定支援

WAS 不只是承載 HTTP 堆疊。 它也能透過其 Listen Adapter 與 Worker Process Framework 來承載其他協定。 WCF 服務利用 WAS 多協定支援。 WCF 協定自帶 Listeners(例如 NET.TCP、NET.MSMQ 或 NET.PIPE Listener)。 這些監聽器透過 WAS 提供的 Listener Adapter Interfaces 連接 WAS。

利用此基礎設施的應用協定可在與一般 ASP.NET 應用程式相同的 .NET 應用域中託管自訂應用程式程式碼。 他們也能利用 ASP.NET 主機環境提供的協定無關服務,例如按需編譯、設定支援等。