앱 풀은 메모리 제한을 존중하지 않습니다


8

메모리 누수가있는 레거시 .NET 앱을 다루고 있습니다. 런 어웨이 메모리 상황을 시도하고 완화하기 위해 500KB에서 500000KB (500MB) 사이의 앱 풀 메모리 제한을 설정했지만 앱 풀은 로그인하여 물리적으로 볼 수 있으므로 설정을 존중하지 않는 것 같습니다 메모리 (5GB 이상) 이 응용 프로그램은 서버를 죽이고 있으며 응용 프로그램 풀을 조정하는 방법을 결정할 수 없습니다. 이 앱 풀이 약 500MB의 메모리를 초과하지 않도록하기 위해 권장하는 설정

다음은 앱 풀이 3.5GB의

프로세스리스트

앱 풀

따라서 서버가 다시 충돌했고 다음과 같은 이유가 있습니다.

여기에 이미지 설명을 입력하십시오

메모리 제한이 낮은 동일한 앱 풀, 1000 회 재순환 요청으로 2 ~ 3 분마다 재순환 이벤트가 발생하지만 때때로 실행됩니다.

또한이 프로세스를 모니터링 할 수있는 도구 (작업 또는 서비스로 30 초마다 실행)가 있으며 일부 제한을 초과하면 프로세스를 종료 할 수 있습니다.


더 나은 결과를 얻으려면 메모리 제한이 아닌 시간 제한을 구성하십시오. 이것을보십시오 .
Nathan C

실제로 100 개의 요청 후에 더 잘 작동하는 것처럼 재활용하도록 설정했지만 모두 동일한 것으로 예상대로 일부 응용 프로그램 풀 설정이 작동하지 않는 것처럼 보입니다.
lucuma

리사이클링에 대한 이벤트 로깅이 활성화되어 있습니까? 거기에 뭐가 있습니까?
MichelZ

개인 메모리 제한 및 재활용에 대해 2 분마다 항목이 있습니다. 문제는 서버의 메모리가 며칠마다 끊어지고 확인할 때 마다이 응용 프로그램 풀에 (그림에서 볼 수 있듯이) Gb의 램이 사용된다는 것입니다.
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());
            }
        }
    }

나는 이것을 내일 시험해보고 무슨 일이 일어나는지 보게 될 것이다.
lucuma 2016 년

스크립트를 시도했지만 프로세스를 찾지 못했습니다.
lucuma

그리고 전체 관리자 권한으로 실행하고 있습니까? 앱 풀의 작업 관리자에서 w3wp를 볼 수 있습니까?
Nik

예, 의견을 게시 한 후 알아 냈습니다. 메모리 누수가 모든 메모리를 소비하는 경우 재활용이 폭탄으로 처리되므로 앱 풀을 재활용하는 대신 프로세스를 종료하도록 스크립트를 수정했습니다. 이론적으로 누출이 헤이 와이어가 될 때 작동해야합니다 (호핑).
lucuma

내가 당신이라면 나는 두 개의 임계 값을 가지게되는데 하나는 재활용 (낮음)과 하나는 죽이는 것입니다. 앱에 따라 방금 죽이면 비행 중 데이터가 손실 될 수 있습니다. 다행 이네요.
Nik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.