Il pool di app non rispetta i limiti di memoria


8

Ho a che fare con un'app .NET legacy che presenta una perdita di memoria. Per tentare di mitigare una situazione di memoria di fuga, ho impostato i limiti di memoria del pool di app da qualsiasi luogo tra 500 KB a 500000 KB (500 MB), tuttavia il pool di app non sembra rispettare le impostazioni in quanto posso accedere e visualizzare il fisico memoria per esso (5 GB e oltre, indipendentemente da quali valori). Questa app sta uccidendo il server e non riesco a determinare come regolare il pool di app. Quali impostazioni consigliate per garantire che questo pool di app non superi i 500 MB di memoria.

Ecco un esempio, il pool di app utilizza 3,5 GB di

Elenco dei processi

Pool di app

Quindi, il server si è appena arrestato nuovamente, ed ecco perché:

inserisci qui la descrizione dell'immagine

Lo stesso pool di app con limiti di memoria bassi, una richiesta di riciclo di 1000 che causa un evento di riciclo ogni due o tre minuti ma a volte scappa.

Sono anche aperto a qualsiasi strumento in grado di monitorare questo processo (eseguendo ogni 30 secondi come attività o servizio) e posso ucciderlo quando supera un certo limite.


Prova a configurare un limite di tempo anziché un limite di memoria per vedere se ottieni risultati migliori. Vedere questo .
Nathan C,

In realtà l'ho impostato per riciclare dopo 100 richieste che sembrano funzionare meglio, ma sembra che alcune impostazioni del pool di app non funzionino come mi aspetto.
lucuma,

Hai eventlogging abilitato per il recyling? qualcosa dentro?
MichelZ,

Ogni 2 minuti viene inserita una voce relativa al limite e al riciclo della memoria privata. Il problema è che ogni pochi giorni la memoria del server esploderà e ogni volta che controllo, questo pool di app ha (come mostra il grafico) Gb di ram utilizzati.
lucuma,

Risposte:


2

Ho trovato questo post perché sto lottando per rispondere a uno simile in cui i limiti non vengono limitati. Vedere IIS WebLimits non rispettato .

Tuttavia, posso dare una pugnalata al tuo problema. Prova il codice c # di seguito. Potresti fare lo stesso con PowerShell. Dovrai eseguirlo con i diritti di amministratore.

 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());
            }
        }
    }

Lo proverò domani e vedrò cosa succede.
lucuma,

Ho provato lo script e non trova il processo.
Lucuma,

E lo stai eseguendo con diritti di amministratore completi? Riesci a vedere w3wp in Task Manager per il tuo pool di app?
Nik,

Sì, l'ho capito dopo aver pubblicato il commento. Ho modificato lo script per terminare il processo invece di riciclare il pool di app poiché il riciclo bombarderà se la perdita di memoria consuma tutta la memoria. In teoria dovrebbe funzionare quando la perdita va in tilt (sperando).
Lucuma,

Se fossi in te, avrei due soglie, una per il riciclaggio (inferiore) e una per l'uccisione. Potresti perdere i dati in volo se uccidi, a seconda della tua app. Sono contento che abbia funzionato.
Nik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.