我應該怎麼做才能確保 IIS 不會回收我的應用程序?
我有一個託管在 IIS 中的 WCF 服務應用程序。在啟動時,它會獲取一個非常昂貴(就時間和 cpu 而言)的資源以用作本地記憶體。
不幸的是,IIS 似乎相當定期地回收該程序。因此,我試圖更改應用程序池上的設置,以確保 IIS 不會回收應用程序。到目前為止,我已經更改了以下內容:
- 限制 CPU 下的間隔從 5 到 0。
- 程序模型下的空閒超時從 20 變為 0。
- 從 1740 到 0 的定期回收時間間隔。
這夠了嗎?我對我更改的項目有一些具體問題:
- CPU下的Limit Interval設置具體是什麼意思?是不是說如果超過一定的CPU使用率,應用程序池就會被回收?
- “回收”究竟是什麼意思?應用程序是否完全拆除並重新啟動?
- “工作程序關閉”和“應用程序池回收”有什麼區別?Process Model 下的 Idle Time-out 文件討論了關閉工作程序。而 Recycling 下的 Regular Time Interval 文件討論了應用程序池回收。我不太了解兩者之間的區別。我認為 w3wp.exe 是執行應用程序池的工作程序。有人可以解釋兩者之間的應用程序的區別嗎?
有 IIS7 和 IIS7.5 標籤的原因是因為應用程序將在兩者中執行,並希望版本之間的答案是相同的。
圖片供參考:
回收
回收通常* IIS 啟動一個新程序作為應用程序的容器,然後讓舊程序
ShutdownTimeLimit
在它被殺死之前自行消失。*- 通常:見
DisallowOverlappingRotation
/“禁用重疊回收”設置它是破壞性的,因為原始過程及其所有狀態資訊都被丟棄了。使用程序外會話狀態(例如,狀態伺服器或數據庫,或者如果您的狀態很小,甚至是 cookie)可以讓您解決這個問題。
但預設情況下它是重疊的——這意味著中斷的持續時間被最小化,因為新程序啟動並連接到請求隊列,在舊程序被告知“你有 [
ShutdownTimeLimit
] 秒離開。請遵守。”之前。設置
對於您的問題:該頁面上的所有設置都以某種方式控制回收。“關閉”可能被描述為“主動回收” - 程序本身決定它的時間,並以有序的方式退出。
反應性回收是 WAS 檢測到問題並啟動過程的地方(在建立合適的替代 W3WP 之後)。
現在,這裡有一些可能導致回收一種或另一種形式的東西:
一個 ISAPI 認為它不健康
任何模組崩潰
空閒超時
CPU限制
調整應用程序池屬性
- 正如你的媽媽可能曾經尖叫過的那樣:“別再挑剔了,否則它永遠不會好轉!”
“ping”失敗 * 實際上並不是 ping 本身,因為它使用命名管道 - 更多“生命檢測”
上面截圖中的所有設置
該怎麼辦:
一般來說:
- 禁用空閒超時。20 分鐘不活動 = 繁榮!老流程沒了!下一個傳入請求的新程序。將其設置為零。
- 禁用正常時間間隔- 29 小時預設設置已被各方描述為“瘋狂”、“煩人”和“聰明”。實際上,只有兩個是真的。
- 如果您無法停止使用它,可以選擇打開DisallowRotationOnConfigChange(上圖,*禁用 Reycling 以更改配置) - 這允許您更改任何應用程序池設置,而不會立即向工作程序發出需要終止它的信號。*您需要手動回收應用程序池以使設置生效,這使您可以預先設置設置,然後使用更改視窗通過回收過程應用它們。
- 作為一般原則,啟用**pinging 。**那是你的安全網。我見過人們把它關掉,然後網站有時會無限期掛起,導致恐慌……所以如果設置對於你的明顯非常非常慢響應的應用程序來說過於激進,請稍微支持一下看看你得到了什麼,而不是把它關掉。(除非您通過自己的監控過程為掛起的 W3WP 設置了自動崩潰模式轉儲)
這足以使行為良好的過程永遠存在。如果它死了,肯定會被替換。如果它掛起,ping 應該會啟動,並且應該在 2 分鐘內啟動一個新的(預設情況下;最壞情況的計算應該是:在請求再次開始工作之前達到ping 頻率+ ping 超時+啟動時間限制)。
CPU 限制通常並不有趣,因為預設情況下它是關閉的,並且它也被配置為無論如何都不做;如果它被配置為終止程序,當然,那將是一個回收觸發器。丟開。注意 IIS 8.x,CPU Throttling 也成為一個選項。
(IIS)AppPool 不是(.Net)AppDomain(但可能包含一個/一些)
但是……然後我們進入.Net土地,以及App Domain回收,這也可能導致狀態失去。(參見:https ://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )
短版,您可以通過觸摸內容文件夾中的 web.config 文件(再次選擇!),或者通過在該文件夾中創建一個文件夾,或者一個 ASPX 文件,或者..其他東西來做到這一點……這就是與應用程序池回收一樣具有破壞性,減去本機程式碼啟動成本(它純粹是託管程式碼 (.Net) 概念,因此這裡只發生託管程式碼初始化)。
防病毒軟體也可以在掃描 web.config 文件時觸發此操作,從而導致更改通知,導致….