Iis

應用程序池不遵守記憶體限制

  • June 11, 2014

我正在處理一個存在記憶體洩漏的遺留 .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());
           }
       }
   }

引用自:https://serverfault.com/questions/598672