應用程序池和工作程序執行緒之間有什麼關係?
我正在對 ASP.NET 應用程序中的重新啟動進行故障排除。該應用程序每天重新啟動大約 20 次。我們強烈懷疑應用程序的一部分,因為當這個特定功能投入生產時,重新啟動就開始了。我已經使用 log4net 庫向這些頁面添加了一些日誌記錄,但是我在解釋日誌時遇到了麻煩。
當 ASP.NET 應用程序在應用程序池中執行時,是只執行該應用程序的一個實例,還是執行該應用程序的多個實例?我知道會產生幾個工作程序執行緒。工作程序執行緒與應用程序池中執行的應用程序有什麼關係?
我想如果有多個應用程序記錄到同一個日誌,我可能無法正確解釋結果。如果一個重新啟動但另一個沒有,則日誌並不能真正告訴我重啟發生時發生的事情。
更新 1
查看此頁面,我發現以下資訊:
應用程序池定義一組一個或多個工作程序,並配置有通用設置,這些設置為分配給該應用程序池的一個或多個應用程序提供請求。因為應用程序池允許一組 Web 應用程序共享一個或多個類似配置的工作程序,所以它們提供了一種方便的方法來將一組 Web 應用程序與伺服器電腦上的其他 Web 應用程序隔離開來。程序邊界將每個工作程序分開;因此,一個應用程序池中的應用程序問題不會影響其他應用程序池中的網站或應用程序。
但我仍然很困惑。我從經驗中知道,我可以分配兩個完全不同的應用程序來使用同一個應用程序池。這是否意味著將產生兩個工作程序?或者是否可以為第一個應用程序生成多個工作程序,並為第二個應用程序生成多個工作程序?如果一個工作程序發生問題,它能否關閉該應用程序池中執行的每個應用程序?
更新 2
從這個關於使用 WinDbg 的頁面,我找到了這個資訊(強調我的):
在 IIS 5.x 中,只有一個 Aspnet_wp.exe 工作程序和一個調試器執行緒。因此,一次只能將一個調試器附加到 Aspnet_wp.exe 程序。如果您在同一台機器上處理多個 Web 應用程序,這可能會造成問題。在 IIS 6.0 中,您可以強制 AppDomain 在單獨的應用程序池中執行。(有關詳細資訊,請參閱第 1 章中的“IIS 5.x 程序模型”和“IIS 6.0 程序模型”。)**單獨的應用程序池提供多個 W3wp.exe 程序。**在這些程序中創建了多個調試器執行緒(每個執行緒一個),使您能夠更有效地進行調試。
在我看來,這聽起來就像每個 App Pool 都有一個
w3wp.exe程序。我解釋對了嗎?如果是這樣,那是否仍然適用於 IIS 7.5?
是的,每個應用程序池通常是一個程序1,但可以包含多個執行緒。您可以將多個站點分配給一個應用程序池,這些站點都將在同一程序下執行,但是它們將在不同的“應用程序域”下執行,這些“應用程序域”是將一個站點的程式碼與另一個站點的程式碼分開的安全上下文,即使它們’重新在同一個應用程序池上執行。
同時訪問站點的兩個使用者可以在不同的執行緒上執行,這意味著他們可以同時執行。這意味著任何日誌記錄都可以散佈值。您可能希望將會話值添加到日誌記錄中,以便您可以根據會話進行排序。
應用程序池重啟(回收)是正常的,一天重啟 20 次似乎並不稀奇。它們每天可能發生多次,並且 IIS 控制應用程序池何時重新啟動。每當感覺需要清理池時,它就會執行此操作。2您的應用程序應該以這樣的方式編寫,以便從這裡優雅地恢復(即,不要在會話中保留任何在應用程序池重新啟動時無法輕鬆重新創建的內容)。
當您的應用程序中發生未處理的異常時,應用程序池也可以重新啟動。在這種情況下,您想解決造成這種情況的原因。此類異常通常記錄在事件日誌中。
1 – 雖然您可以將應用程序池配置為具有多個工作程序(這稱為Web Garden),但根據我的經驗,這不是典型的(也不是通常推薦的)配置。
2 – 請注意,使用 IIS 管理器,您可以配置應用程序以將回收事件記錄到 Windows 事件日誌中。您還可以使用 IIS 管理器設置幾種不同類型的回收事件發生時的門檻值。