IIS 6 + ASP.NET Web 服務 - DW20 和 stackoverflow 異常
考慮一個 ASP.NET SOAP Web 服務,該服務啟動良好,但在收到第一次命中時就很難啟動。
請注意,這是在測試環境中進行的部署,而不是在 PreProd 環境中。兩者都是 Windows 2003 SP3 + IIS 6 + ASP.NET 3.5。都是最新的。
我們看到的行為是:
- 重新啟動站點和應用程序池
- 應用程序池配置為在網路服務下執行。
- 正如預期的那樣,瀏覽到 .asmx 和 .wsdl 會正常響應。
- 向 Web 服務發送一個格式良好的普通 SOAP 請求/普通有效負載
- 100% CPU 使用率
- 5秒後,頁面請求/站點返回“服務不可用”
- IIS 日誌文件中未創建任何條目(即 c:\windows\system32\logfiles\W3C-foo)
- 應用程序池最終被停止
對 CPU 造成重創的程序是
dw20.exe
. 我不確定為什麼 Watson 博士會參與其中。事件日誌顯示 ASP.NET 執行時錯誤:
任務管理器:
事件日誌文本:
EventType clr20r3、P1 w3wp.exe、P2 6.0.3790.3959、P3 45d6968e、P4 錯誤管理、P5 1.0.0.0、P6 4b86a13f、P7 24、P8 0、P9 system.stackoverflowexception、P10 NIL。
問題
關於這個 system.stackoverflow 異常可能是什麼的任何想法?鑑於環境之間的程式碼相同,這可能是有效負載問題嗎?會不會是配置問題?您可以在異常消息中看到我的 .NET 程序集的名稱:“ErrorManagement”
這個(可能是唯一的)問題的解決方案:
- 刪除並重新創建所有應用程序池(這可能是多餘且不需要的)
- 刪除磁碟上的應用程序文件
- 重新部署和新的建構和版本的應用程序
- 確保所有引用都包含在 bin 目錄中
Stackoverflow 異常是一種特殊情況,因為受影響的應用程序不能再做任何事情(例如記錄堆棧跟踪) - 在這種情況下,應用程序池程序 (w3p.exe) 會被作業系統終止。這就是沃森博士/DW20 參與其中的原因。您可以嘗試使用帶有 SOS 擴展的 WinDbg 調試 DW20 保存的轉儲(如果您不熟悉該工具集,預計會出現陡峭的學習曲線 - 我希望使用 VS2010 時這會變得更容易)。
高 CPU 使用率(通常是高記憶體使用率)是由 DW20 引起的,如果“crash-and-restart-loop”比 DW20 快,因此會累積多個 DW20 程序,這尤其令人討厭。
預設的 IIS 應用程序池設置是在短時間內重啟崩潰的應用程序不超過 3 次,否則它們將被停止以保護伺服器免受 DoS 攻擊。
關於根本原因,stackoverflow:可能是一切……但是這個瘋狂的猜測怎麼樣:由於配置錯誤,數據庫訪問失敗,生成異常,並且您的應用程序正在將異常記錄到數據庫中,而沒有在異常處理中擷取異常; )