应用程序池不尊重内存限制

Modified on: Mon, 29 Jul 2019 00:40:02 +0800

我正在处理一个内存泄漏的旧版.NET应用程序。为了尝试缓解失控的内存情况,我将应用程序池内存限制设置在500KB到500000KB(500MB)之间,但是应用程序池似乎不尊重设置,因为我可以登录并查看物理内存(5GB及以上,无论什么值)。这个应用程序正在杀死服务器,我似乎无法确定如何调整应用程序池。您建议使用哪些设置以确保此应用程序池不超过大约500mb的内存。

以下是一个示例,应用程序池使用3.5GB的

所以,服务器再次崩溃,原因如下:

具有低内存限制的相同应用程序池,1000个循环请求,每两到三分钟会导致一次循环事件,但有时它会跑掉。

我也对任何可以监控此过程的工具(每30秒作为一项任务或服务运行)开放,并且当它超过某个限制时可以杀死它。

作者:,lucuma

最佳答案

我发现这篇文章是因为我很难回答类似的限制不受限制的问题。请参阅未遵守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());
            }
        }
    }
作者:Community,Nik

相关问答

添加新评论