O App Pool não respeita os limites de memória

8

Estou lidando com um aplicativo .NET legado que tem um vazamento de memória. Para tentar minimizar uma situação de memória de fuga, defini os limites de memória do pool de aplicativos de 500 KB a 500.000 KB (500 MB), mas o pool de aplicativos não parece respeitar as configurações, pois eu posso fazer login e ver o físico memória para isso (5GB e acima, não importa quais valores). Este aplicativo está matando o servidor e não consigo determinar como ajustar o pool de aplicativos. Quais configurações você recomenda para garantir que esse pool de aplicativos não exceda cerca de 500 MB de memória.

Aqui está um exemplo, o pool de aplicativos está usando 3,5 GB de

Então, o servidor travou de novo, e aqui está o porquê:

O mesmo pool de aplicativos com limites baixos de memória, uma solicitação de 1.000 reciclagens que causa um evento de reciclagem a cada dois ou três minutos, mas às vezes ele simplesmente desaparece.

Eu também estou aberto a qualquer ferramenta que possa monitorar esse processo (seja executada a cada 30 segundos como uma tarefa ou serviço) e pode matá-lo quando exceder algum limite.

    
por lucuma 26.05.2014 / 23:15

1 resposta

2

Encontrei este post porque estou com dificuldades para responder a um problema semelhante em que os limites não estão sendo restritos. Veja IIS WebLimits não sendo respeitados .

No entanto, posso dar uma olhada no seu problema. Experimente o código c # abaixo. Você poderia fazer o mesmo com o powershell. Você precisará executá-lo com direitos de administrador.

 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());
            }
        }
    }
    
por 12.06.2014 / 00:48