2010-11-22

如何自動回收 IIS 的 Application Pool

在IIS6 中,ASP.NET default 是跑在 worker process isolation mode

即,我們可以透過 Application Pool 的設定,讓不同的 ASP.NET 應用程式,跑在不同的 application pool中,由不同的 worker process 來處理,這樣的做法,可以避免將一個雞蛋放在同一個籠子裡,讓表現異常的應用程式,沒法影響到在其它Application Pool 中的程式

談到「異常」的應用程式...

有些人寫出來的APP就是莫明奇妙會掛點、Hang住、出問題~
積極的處理方式是做完整的測試、Code Review將問題查出並修正
消極的處理方式則是進行 IIS重啟(iisreset) 或 Application Pool Recycle(應用程式集區回收),看看有沒有辦法恢復正常

因使用IIS重啟是整個IIS都會被影響到,所以 可以就發生問題的Application Pool 進行回收 以降低影響範圍

Application Pool Recycle 這種被動的方式,除了可透過application pool 設定進行定期的回收外:


有時,我們可能想要透過一監測程式,在監測到有異常時,才執行application pool 回收
更甚者,我們可能在一台主機監測,而需要回收遠端主機的 application pool...

此時,主要可透過兩種方式來達成:

A. 透過 WMI 的方式, 我有 google 到下列的方式,但未試做:
http://gallery.technet.microsoft.com/ScriptCenter/en-us/22b10d93-e734-4fda-8ebe-2df30e54c64b
http://www.vistax64.com/powershell/103705-remote-application-pool-recycle-using-wmi-powershell.html
http://forums.iis.net/p/1033115/1421721.aspx

B. 透過 IIS 主機內建的 c:\windows\system32\iisapp.vbs 此 script,並搭配如 psexec 此類的遠端執行shell 指命的tool, 來達成:

iisapp.vbs 用法:

C:\>cscript c:\windows\system32\iisapp.vbs /a {ApplicationPoolName} /r

搭配 psexec 在 C# 程式中,可以用這種方式來達成遠端回收 application pool的效果:

Process process = new Process();
process.StartInfo.FileName = @"D:\PsTools\psexec.exe";
process.StartInfo.Arguments = @"\\{原端主機IP} -u {帳號} -p {密碼} cscript c:\windows\system32\iisapp.vbs /a {要回收的application pool name} /r";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.WaitForExit();

psexec 為 PsTools 內的一項utility,可在此下載

沒有留言: