Iis
應用程序池不遵守記憶體限制
我正在處理一個存在記憶體洩漏的遺留 .NET 應用程序。為了嘗試緩解記憶體失控的情況,我將應用程序池記憶體限制設置在 500KB 到 500000KB (500MB) 之間的任何位置,但是應用程序池似乎不尊重這些設置,因為我可以登錄並查看物理它的記憶體(5GB及以上,無論什麼值)。這個應用程序正在殺死伺服器,我似乎無法確定如何調整應用程序池。您推薦什麼設置以確保此應用程序池不超過大約 500mb 的記憶體。
這是一個範例,應用程序池使用 3.5GB
所以,伺服器又崩潰了,原因如下:
相同的應用程序池具有低記憶體限制,一個 1000 次回收請求,每兩到三分鐘就會導致一次回收事件,但有時它會跑掉。
我也對任何可以監視此過程的工具持開放態度(作為任務或服務每 30 秒執行一次)並且可以在超過某個限制時終止它。
我發現這篇文章是因為我正在努力回答一個沒有限制的類似文章。請參閱IIS WebLimits not being respected。
但是,我可以解決您的問題。試試下面的 c# 程式碼。你可以用 powershell 做同樣的事情。您需要以管理員權限執行它。
static void Main(string[] args) { string appPoolName = args[0]; int memLimitMegs = Int32.Parse(args[1]); var regex = new System.Text.RegularExpressions.Regex(".*w3wp.exe \\-ap \"(.*?)\".*"); //find w3wp procs.... foreach (var p in Process.GetProcessesByName("w3wp")) { string thisAppPoolName = null; try { //Have to use WMI objects to get the command line params... using (var searcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + p.Id)) { StringBuilder commandLine = new StringBuilder(); foreach (ManagementObject @object in searcher.Get()) { commandLine.Append(@object["CommandLine"] + " "); } //extract the app pool name from those. var r = regex.Match(commandLine.ToString()); if (r.Success) { thisAppPoolName = r.Groups[1].Value; } if (thisAppPoolName == appPoolName) { //Found the one we're looking for. if (p.PrivateMemorySize64 > memLimitMegs*1024*1024) { //it exceeds limit, recycle it using appcmd. Process.Start(Path.Combine(System.Environment.SystemDirectory , "inetsrv", "appcmd.exe"), "recycle apppool /apppool.name:" + appPoolName); Console.WriteLine("Recycled:" + appPoolName); } } } } catch (Win32Exception ex) { Console.WriteLine(ex.ToString()); } } }