Nhóm ứng dụng không tôn trọng giới hạn bộ nhớ


8

Tôi đang làm việc với một ứng dụng .NET cũ bị rò rỉ bộ nhớ. Để thử và giảm thiểu tình trạng bộ nhớ chạy, tôi đã đặt giới hạn bộ nhớ nhóm ứng dụng từ bất kỳ nơi nào trong khoảng từ 500KB đến 500000KB (500MB) tuy nhiên nhóm ứng dụng dường như không tôn trọng cài đặt vì tôi có thể đăng nhập và xem vật lý bộ nhớ cho nó (5GB trở lên cho dù giá trị nào). Ứng dụng này đang giết chết máy chủ và dường như tôi không thể xác định cách điều chỉnh nhóm ứng dụng. Bạn khuyên dùng cài đặt nào để đảm bảo nhóm ứng dụng này không vượt quá khoảng 500mb bộ nhớ.

Dưới đây là một ví dụ, nhóm ứng dụng đang sử dụng 3,5 GB

Danh sách quy trình

Nhóm ứng dụng

Vì vậy, máy chủ vừa gặp sự cố một lần nữa và đây là lý do:

nhập mô tả hình ảnh ở đây

Nhóm ứng dụng tương tự có giới hạn bộ nhớ thấp, yêu cầu 1000 lần tái chế gây ra sự kiện tái chế cứ sau hai hoặc ba phút nhưng đôi khi nó chỉ chạy đi.

Tôi cũng mở cho bất kỳ công cụ nào có thể theo dõi quá trình này (chạy cứ sau 30 giây như một nhiệm vụ hoặc dịch vụ) và có thể giết chết nó khi vượt quá giới hạn.


Hãy thử định cấu hình giới hạn thời gian thay vì giới hạn bộ nhớ để xem bạn có nhận được kết quả tốt hơn không. Xem này .
Nathan C

Tôi thực sự đã thiết lập nó để tái chế sau 100 yêu cầu có vẻ hoạt động tốt hơn nhưng tất cả đều giống như một số cài đặt nhóm ứng dụng không hoạt động như tôi mong đợi.
lucuma

Bạn có đăng ký sự kiện để kích hoạt lại không? có gì trong đó không?
MichelZ

Có một mục nhập cứ sau 2 phút về giới hạn bộ nhớ riêng và tái chế. Vấn đề là cứ sau vài ngày bộ nhớ của máy chủ sẽ nổ tung và mỗi lần tôi kiểm tra, nhóm ứng dụng này có (như các chương trình đồ họa) Gb của ram được sử dụng.
lucuma

Câu trả lời:


2

Tôi tìm thấy bài đăng này bởi vì tôi đang đấu tranh để trả lời một bài tương tự trong đó giới hạn không bị hạn chế. Xem IIS WebLimits không được tôn trọng .

Tuy nhiên, tôi có thể đâm đầu vào vấn đề của bạn. Hãy thử mã c # dưới đây. Bạn có thể làm tương tự với powershell. Bạn sẽ cần chạy nó với quyền quản trị.

 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());
            }
        }
    }

Tôi sẽ thử điều này vào ngày mai và xem điều gì sẽ xảy ra.
lucuma

Tôi đã thử kịch bản và nó không tìm thấy quy trình.
lucuma

Và bạn đang chạy nó với quyền quản trị đầy đủ? Bạn có thể thấy w3wp trong trình quản lý tác vụ cho nhóm ứng dụng của mình không?
Nik

Vâng, tôi đã tìm ra điều đó sau khi đăng bình luận. Tôi đã sửa đổi tập lệnh để giết tiến trình thay vì tái chế nhóm ứng dụng vì việc tái chế sẽ đánh bom nếu rò rỉ bộ nhớ tiêu thụ hết bộ nhớ. Về lý thuyết, nó sẽ hoạt động khi rò rỉ đi haywire (hy vọng).
lucuma

Nếu tôi là bạn thì tôi có hai ngưỡng, một để tái chế (thấp hơn) và một để giết. Bạn có thể mất dữ liệu trong chuyến bay nếu bạn vừa giết, tùy thuộc vào ứng dụng của bạn. Vui mừng nó làm việc ra.
Nik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.