App Pool tidak menghormati batas memori

8

Saya berurusan dengan aplikasi .NET lama yang memiliki kebocoran memori. Untuk mencoba dan mengurangi situasi memori yang kabur, saya telah menetapkan batas memori kumpulan aplikasi dari mana saja antara 500KB hingga 500000KB (500MB) namun kumpulan aplikasi tampaknya tidak menghargai pengaturan karena saya dapat masuk dan melihat fisik memori untuk itu (5GB dan di atas, apa pun nilainya). Aplikasi ini mematikan server dan sepertinya saya tidak bisa menentukan cara menyesuaikan kumpulan aplikasi. Pengaturan apa yang Anda rekomendasikan untuk memastikan kumpulan aplikasi ini tidak melebihi sekitar 500mb memori.

Berikut adalah contohnya, kumpulan aplikasi menggunakan 3.5GB

Daftar proses

Pool aplikasi

Jadi, server hanya mogok lagi, dan inilah sebabnya:

masukkan deskripsi gambar di sini

Kumpulan aplikasi yang sama dengan batas memori rendah, permintaan daur ulang 1000 yang menyebabkan acara daur ulang setiap dua atau tiga menit tetapi kadang-kadang hanya hilang.

Saya juga terbuka untuk alat apa pun yang dapat memantau proses ini (berjalan setiap 30 detik sebagai tugas atau layanan) dan dapat membunuhnya ketika melebihi batas tertentu.

lucuma
sumber
Coba konfigurasikan batas waktu daripada batas memori untuk melihat apakah Anda mendapatkan hasil yang lebih baik. Lihat ini .
Nathan C
Saya benar-benar mengaturnya untuk mendaur ulang setelah 100 permintaan yang tampaknya berfungsi lebih baik tetapi semua sama sepertinya beberapa pengaturan kumpulan aplikasi tidak berfungsi seperti yang saya harapkan.
lucuma
Apakah Anda memiliki eventlogging untuk recyling diaktifkan? ada apa di sana?
MichelZ
Ada entri setiap 2 menit tentang batas memori pribadi dan daur ulang. Masalahnya adalah bahwa setiap beberapa hari memori server akan meledak dan setiap kali saya periksa, kumpulan aplikasi ini memiliki (seperti yang ditunjukkan gambar) Gb tentang ram yang digunakan.
Lucuma

Jawaban:

2

Saya menemukan posting ini karena saya berjuang untuk menjawab yang serupa di mana batas tidak dibatasi. Lihat IIS WebLimits tidak dihormati .

Namun, saya bisa menusuk masalah Anda. Coba kode c # di bawah ini. Anda bisa melakukan hal yang sama dengan PowerShell. Anda harus menjalankannya dengan hak admin.

 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
sumber
Saya akan mencoba ini besok dan melihat apa yang terjadi.
lucuma
Saya mencoba skrip dan tidak menemukan proses.
lucuma
Dan Anda menjalankannya dengan hak admin penuh? Bisakah Anda melihat w3wp di task manager untuk kumpulan aplikasi Anda?
Nik
Ya, saya mengetahuinya setelah memposting komentar. Saya memodifikasi skrip untuk menghentikan proses alih-alih mendaur ulang kumpulan aplikasi karena daur ulang tersebut akan meledak jika kebocoran memori menghabiskan semua memori. Secara teori itu harus bekerja ketika kebocoran menjadi kacau (berharap).
lucuma
Jika saya jadi Anda, saya akan memiliki dua ambang batas, satu untuk daur ulang (lebih rendah), dan satu untuk membunuh. Anda bisa kehilangan data dalam penerbangan jika Anda hanya membunuh, tergantung pada aplikasi Anda. Senang itu berhasil.
Nik