O pool de aplicativos não respeita os limites de memória

8

Estou lidando com um aplicativo .NET herdado que tem um vazamento de memória. Para tentar atenuar uma situação de memória fugitiva, defini os limites de memória do pool de aplicativos entre 500 KB e 500000 KB (500 MB), no entanto, o pool de aplicativos parece não respeitar as configurações, pois eu consigo fazer login e visualizar o conteúdo físico. memória para ele (5 GB ou mais, independentemente dos 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 em torno de 500mb de memória.

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

Lista de processos

Pool de aplicativos

Portanto, o servidor travou novamente e aqui está o porquê:

insira a descrição da imagem aqui

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

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

lucuma
fonte
Tente configurar um limite de tempo em vez de limite de memória para ver se obtém melhores resultados. Veja isso .
Nathan C
Na verdade, eu o defino para reciclar após 100 solicitações, o que parece funcionar melhor, mas, ao mesmo tempo, parece que algumas das configurações do pool de aplicativos não funcionam como eu esperava.
lucuma 27/05
Você possui o registro de eventos para reciclagem ativado? Tem alguma coisa aí?
MichelZ
Há uma entrada a cada 2 minutos sobre o limite de memória privada e reciclagem. O problema é que, a cada poucos dias, a memória do servidor explode e toda vez que eu checo, esse pool de aplicativos tem (como o gráfico mostra) Gb de RAM usado.
Lucuma 27/05

Respostas:

2

Encontrei este post porque estou tentando responder a um similar em que os limites não estão sendo restritos. Consulte os WebLimits do IIS não sendo respeitados .

No entanto, posso dar uma facada 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());
            }
        }
    }
Nik
fonte
Vou tentar amanhã e ver o que acontece.
lucuma
Eu tentei o script e ele não encontra o processo.
lucuma
E você está executando com todos os direitos de administrador? Você consegue ver o w3wp no gerenciador de tarefas do seu pool de aplicativos?
Nik
Sim, eu descobri isso depois de postar o comentário. Modifiquei o script para interromper o processo em vez de reciclar o pool de aplicativos, pois a reciclagem bombardeia se o vazamento de memória consumir toda a memória. Em teoria, deve funcionar quando o vazamento der errado (na esperança).
lucuma
Se eu fosse você, teria dois limiares, um para reciclagem (inferior) e outro para matar. Você pode perder dados em voo se apenas matar, dependendo do seu aplicativo. Ainda bem que funcionou.
21414 Nik