El grupo de aplicaciones no respeta los límites de memoria

8

Estoy tratando con una aplicación .NET heredada que tiene una pérdida de memoria. Con el fin de tratar de mitigar una situación de memoria de escape, he establecido los límites de memoria del grupo de aplicaciones entre 500 KB y 500000 KB (500 MB), sin embargo, el grupo de aplicaciones no parece respetar la configuración, ya que puedo iniciar sesión y ver el archivo físico. memoria para ello (5GB y más, sin importar los valores). Esta aplicación está matando al servidor y parece que no puedo determinar cómo ajustar el grupo de aplicaciones. ¿Qué configuración recomienda para garantizar que este grupo de aplicaciones no supere los 500 MB de memoria?

Aquí hay un ejemplo, el grupo de aplicaciones está utilizando 3.5GB de

Lista de procesos

Grupo de aplicaciones

Entonces, el servidor se bloqueó nuevamente, y esta es la razón:

ingrese la descripción de la imagen aquí

El mismo grupo de aplicaciones con límites de memoria bajos, una solicitud de reciclaje 1000 que causa un evento de reciclaje cada dos o tres minutos, pero a veces simplemente se acaba.

También estoy abierto a cualquier herramienta que pueda monitorear este proceso (ya sea que se ejecute cada 30 segundos como una tarea o servicio) y pueda matarlo cuando exceda algún límite.

lúcuma
fuente
Intente configurar un límite de tiempo en lugar del límite de memoria para ver si obtiene mejores resultados. Mira esto .
Nathan C
De hecho, lo configuré para reciclar después de 100 solicitudes, lo que parece funcionar mejor, pero de todos modos parece que algunas de las configuraciones del grupo de aplicaciones no funcionan como esperaba.
lucuma
¿Tiene habilitado el registro de eventos para reciclaje? ¿Hay algo ahí?
MichelZ
Hay una entrada cada 2 minutos sobre el límite de memoria privada y el reciclaje. El problema es que cada pocos días la memoria del servidor explotará y cada vez que lo verifique, este grupo de aplicaciones tiene (como muestra el gráfico) Gb de ram utilizado.
lucuma

Respuestas:

2

Encontré esta publicación porque estoy luchando por responder una similar donde los límites no están restringidos. Ver IIS WebLimits no se respeta .

Sin embargo, puedo apuñalar su problema. Pruebe el código C # a continuación. Podrías hacer lo mismo con powershell. Deberá ejecutarlo con derechos 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());
            }
        }
    }
Nik
fuente
Probaré esto mañana y veré qué pasa.
lucuma
Intenté el script y no encuentra el proceso.
lucuma
¿Y lo estás ejecutando con todos los derechos de administrador? ¿Puedes ver w3wp en el administrador de tareas para tu grupo de aplicaciones?
Nik
Sí, lo descubrí después de publicar el comentario. Modifiqué el script para eliminar el proceso en lugar de reciclar el grupo de aplicaciones, ya que el reciclaje bombardeará si la pérdida de memoria consume toda la memoria. En teoría, debería funcionar cuando la fuga se vuelve loca (con la esperanza).
lucuma
Si yo fuera tú, tendría dos umbrales, uno para reciclar (más bajo) y otro para matar. Podría perder datos en vuelo si acaba de matar, dependiendo de su aplicación. Me alegro de que funcionó.
Nik