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

8

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

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

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

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

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

введите описание изображения здесь

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

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

Lucuma
источник
Попробуйте настроить ограничение по времени, а не по объему памяти, чтобы увидеть, если вы получите лучшие результаты. Смотрите это .
Натан С,
Я на самом деле настроил его на перезапуск после 100 запросов, который, кажется, работает лучше, но все же кажется, что некоторые настройки пула приложений работают не так, как я ожидаю.
Лукума
Есть ли у вас журнал событий для повторного использования? что-нибудь там?
MichelZ
Каждые 2 минуты есть запись об ограничении и перезапуске частной памяти. Проблема заключается в том, что каждые несколько дней память сервера взрывается, и каждый раз, когда я проверяю, в этом пуле приложений (как показано на графике) используются Гб оперативной памяти.
lucuma

Ответы:

2

Я нашел этот пост, потому что я изо всех сил пытаюсь ответить на аналогичный, где ограничения не ограничены. См. 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());
            }
        }
    }
Nik
источник
Я попробую это завтра и посмотрю, что произойдет.
lucuma
Я попробовал сценарий, и он не находит процесс.
lucuma
И вы запускаете его с полными правами администратора? Можете ли вы увидеть w3wp в диспетчере задач для вашего пула приложений?
Ник
Да, я понял это после публикации комментария. Я изменил сценарий, чтобы убить процесс вместо того, чтобы перезапускать пул приложений, так как перезапуск будет бомбить, если утечка памяти займет всю память. Теоретически это должно работать, когда утечка становится слабой (надеясь).
lucuma
Если бы я был тобой, у меня было бы два порога: один для переработки (ниже) и один для убийства. Вы можете потерять данные в полете, если просто убьете, в зависимости от вашего приложения. Рад, что все получилось.
Ник