App Pool ne respecte pas les limites de mémoire

8

Je traite avec une application .NET héritée qui a une fuite de mémoire. Afin d'essayer d'atténuer une situation de mémoire de fuite, j'ai défini les limites de mémoire du pool d'applications entre 500 Ko et 500 000 Ko (500 Mo), mais le pool d'applications ne semble pas respecter les paramètres car je peux me connecter et afficher le physique mémoire pour elle (5 Go et plus quelles que soient les valeurs). Cette application tue le serveur et je n'arrive pas à déterminer comment ajuster le pool d'applications. Quels paramètres recommandez-vous pour garantir que ce pool d'applications ne dépasse pas environ 500 Mo de mémoire.

Voici un exemple, le pool d'applications utilise 3,5 Go de

Liste des processus

Pool d'applications

Ainsi, le serveur vient de se planter à nouveau, et voici pourquoi:

entrez la description de l'image ici

Le même pool d'applications avec de faibles limites de mémoire, une demande de recyclage de 1000 qui provoque un événement de recyclage toutes les deux ou trois minutes, mais parfois il s'enfuit.

Je suis également ouvert à tout outil qui peut surveiller ce processus (soit s'exécuter toutes les 30 secondes en tant que tâche ou service) et peut le tuer lorsqu'il dépasse une certaine limite.

lucuma
la source
Essayez de configurer une limite de temps plutôt qu'une limite de mémoire pour voir si vous obtenez de meilleurs résultats. Regardez ça .
Nathan C
En fait, je l'ai configuré pour recycler après 100 demandes, ce qui semble fonctionner mieux, mais il semble tout de même que certains des paramètres du pool d'applications ne fonctionnent pas comme prévu.
lucuma
Le journal des événements pour le recyclage est-il activé? quelque chose là-dedans?
MichelZ
Il y a une entrée toutes les 2 minutes sur la limite de mémoire privée et le recyclage. Le problème est que tous les quelques jours la mémoire du serveur va exploser et chaque fois que je vérifie, ce pool d'applications a (comme le montre le graphique) Gb de RAM utilisé.
lucuma

Réponses:

2

J'ai trouvé ce message parce que j'ai du mal à répondre à un message similaire où les limites ne sont pas restreintes. Voir IIS WebLimits non respectés .

Cependant, je peux essayer votre problème. Essayez le code c # ci-dessous. Vous pouvez faire de même avec PowerShell. Vous devrez l'exécuter avec les droits d'administrateur.

 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
la source
Je vais essayer ça demain et voir ce qui se passe.
lucuma
J'ai essayé le script et il ne trouve pas le processus.
lucuma
Et vous l'exécutez avec les droits d'administrateur complets? Pouvez-vous voir w3wp dans le gestionnaire de tâches pour votre pool d'applications?
Nik
Oui, je l'ai compris après avoir posté le commentaire. J'ai modifié le script pour tuer le processus au lieu de recycler le pool d'applications car le recyclage se bombardera si la fuite de mémoire consomme toute la mémoire. En théorie, cela devrait fonctionner lorsque la fuite se détraque (en espérant).
lucuma
Si j'étais vous, j'aurais alors deux seuils, un pour le recyclage (inférieur) et un pour le meurtre. Vous pouvez perdre des données en vol si vous tuez, selon votre application. Heureux que ça ait marché.
Nik