Пул приложений не учитывает ограничения памяти

Я имею дело с устаревшим приложением.NET, у которого есть утечка памяти. Чтобы попытаться смягчить ситуацию с нехваткой памяти, я установил пределы памяти пула приложений в диапазоне от 500 до 500000 КБ (500 МБ), однако пул приложений, похоже, не соответствует настройкам, так как я могу войти в систему и просмотреть физическую информацию. память для него (5ГБ и выше независимо от того, какие значения). Это приложение убивает сервер, и я не могу определить, как настроить пул приложений. Какие параметры вы рекомендуете, чтобы пул приложений не превышал 500 МБ памяти.

Вот пример, пул приложений использует 3,5 ГБ

Список процессов

Пул приложений

Итак, сервер снова вышел из строя, и вот почему:

введите описание здесь

Тот же пул приложений с низкими ограничениями памяти, запрос на 1000 перезапусков, который вызывает событие перезапуска каждые две или три минуты, но иногда он просто убегает.

Я также открыт для любого инструмента, который может контролировать этот процесс (либо запускать каждые 30 секунд в качестве задачи или службы) и может уничтожить его, когда он превысит некоторый лимит.

1 ответ

Решение

Я нашел этот пост, потому что изо всех сил пытаюсь ответить на аналогичный, где ограничения не ограничены. См. IIS WebLimits не соблюдаются.

Тем не менее, я могу нанести удар по вашей проблеме. Попробуйте код C# ниже. Вы можете сделать то же самое с PowerShell. Вам нужно будет запустить его с правами администратора.

 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());
            }
        }
    }
Другие вопросы по тегам