Memperbaiki beban awal yang lambat untuk IIS

129

IIS memiliki fitur yang mengganggu untuk situs web dengan lalu lintas rendah di mana ia mendaur ulang proses pekerja yang tidak digunakan, menyebabkan pengguna pertama ke situs setelah beberapa waktu mendapatkan penundaan yang sangat lama (30+ detik).

Saya telah mencari solusi untuk masalah ini dan saya telah menemukan solusi potensial ini.

A. Gunakan plugin Inisialisasi Aplikasi

B. Gunakan Mulai-Otomatis dengan .NET 4

C. Nonaktifkan batas waktu idle (di bawah IIS Reset)

D. Mengkompilasi ulang situs

Saya bertanya-tanya mana yang lebih disukai, dan yang lebih penting, mengapa ada begitu banyak solusi untuk masalah yang sama? (Dugaan saya adalah mereka tidak, dan saya hanya tidak memahami sesuatu dengan benar).

Edit

Performing C tampaknya cukup untuk menjaga agar situs saya tetap hangat, tetapi saya telah menemukan bahwa akar sebenarnya dari lambatnya situs saya ada hubungannya dengan Entity Framework, yang sepertinya tidak bisa mencari tahu mengapa ini menjadi dingin. Lihat pertanyaan ini , yang sayangnya belum dijawab tetapi telah dijawab!

Saya akhirnya hanya harus membuat skrip pemanasan untuk mengunjungi situs saya sesekali untuk memastikannya tetap cepat.

Cavyn VonDeylen
sumber
Hai teman, Apakah Berkinerja C cukup? Mengapa Apakah kita hanya perlu menggunakannya atau perlu juga menonaktifkan daur ulang? Saya selalu merasa hari pertama permintaan pertama sangat lambat dari IIS7.5
qakmak

Jawaban:

36

Pilihan A, B dan D tampaknya berada dalam kategori yang sama karena mereka hanya mempengaruhi waktu mulai awal, mereka melakukan pemanasan situs web seperti kompilasi dan pemuatan perpustakaan di memori.

Menggunakan C, mengatur batas waktu idle, harus cukup sehingga permintaan berikutnya ke server dilayani dengan cepat (memulai ulang kumpulan aplikasi membutuhkan waktu cukup lama - dalam urutan detik).

Sejauh yang saya tahu, batas waktu ada untuk menghemat memori yang dijalankan oleh situs lain secara paralel pada mesin itu. Harga satu kali waktu muat lambat.

Selain fakta bahwa kumpulan aplikasi akan dimatikan jika tidak ada aktivitas pengguna, kumpulan aplikasi juga akan didaur ulang secara default setiap 1740 menit (29 jam).

Dari technet:

Kumpulan aplikasi Layanan Informasi Internet (IIS) dapat secara berkala didaur ulang untuk menghindari keadaan tidak stabil yang dapat menyebabkan aplikasi crash, hang, atau kebocoran memori.

Selama daur ulang kumpulan aplikasi dibiarkan, itu sudah cukup. Tetapi jika Anda benar-benar menginginkan kinerja terbaik untuk sebagian besar komponen, Anda juga harus menggunakan sesuatu seperti Modul Inisialisasi Aplikasi yang Anda sebutkan.

Răzvan Flavius ​​Panda
sumber
Jadi, akankah Anda merekomendasikan hanya menonaktifkan idle-timeout? Apakah itu akan menyebabkan masalah di sepanjang garis (saya menduga itu ada karena suatu alasan)?
Cavyn VonDeylen
3
Ini sebenarnya tidak memperbaiki masalah saya (lihat edit saya), tetapi saya menerimanya karena Anda memang menjawab pertanyaan awal saya.
Cavyn VonDeylen
10

Tantangan Web Hosting

Anda harus ingat bahwa tidak ada opsi konfigurasi mesin yang tersedia jika Anda di-host di server bersama karena banyak dari kita (perusahaan kecil dan individu).

ASP.NET MVC Overhead

Situs saya membutuhkan setidaknya 30 detik ketika belum mencapai lebih dari 20 menit (dan aplikasi web telah dihentikan). Mengerikan sekali.

Cara Lain untuk Menguji Kinerja

Ada cara lain untuk menguji apakah itu ASP.NET MVC Anda memulai atau sesuatu yang lain. Jatuhkan halaman HTML normal di situs Anda tempat Anda dapat menekannya secara langsung.
Jika masalah terkait dengan ASP.NET MVC mulai, maka halaman HTML akan segera render bahkan ketika aplikasi web belum dimulai.
Begitulah cara saya pertama kali menyadari bahwa masalahnya ada di startup ASP.NET MVC. Saya memuat halaman HTML kapan saja dan itu akan memuat dengan sangat cepat. Kemudian, setelah mencapai halaman HTML itu, saya menekan salah satu URL ASP.NET MVC saya dan saya akan mendapatkan pesan Chrome "Menunggu raddev.us ..."

Tes Lain Dengan Script Bermanfaat

Setelah itu saya menulis skrip LINQPad (lihat http://linqpad.net untuk lebih lanjut) yang akan mengenai situs web saya setiap 8 menit (kurang dari waktu aplikasi diturunkan - yang seharusnya 20 menit) dan saya membiarkan itu berjalan berjam-jam.

Saat skrip berjalan, saya membuka situs web saya dan setiap kali situs saya muncul dengan sangat cepat. Ini memberi saya ide yang baik bahwa kemungkinan besar kelambatan yang saya alami adalah karena waktu startup ASP.NET MVC.

Dapatkan LinqPad dan Anda dapat menjalankan skrip berikut - cukup ubah URL ke milik Anda dan biarkan berjalan dan Anda dapat mengujinya dengan mudah. Semoga berhasil.

CATATAN : Di LinqPad Anda harus menekan F4 dan menambahkan referensi ke System.Net untuk menambahkan perpustakaan yang akan mengambil halaman Anda.

JUGA : pastikan Anda mengubah variabel String URL untuk menunjuk pada URL yang akan memuat rute dari situs ASP.NET MVC Anda sehingga mesin akan berjalan.

System.Timers.Timer webKeepAlive = new System.Timers.Timer();
Int64 counter = 0;
void Main()
{
    webKeepAlive.Interval = 5000;
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed;
    webKeepAlive.Start();
}

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    webKeepAlive.Stop();
    try
    {
        // ONLY the first time it retrieves the content it will print the string
        String finalHtml = GetWebContent();
        if (counter < 1)
        {
            Console.WriteLine(finalHtml);
        }
        counter++;
    }
    finally
    {
        webKeepAlive.Interval = 480000; // every 8 minutes
        webKeepAlive.Start();
    }
}

public String GetWebContent()
{
    try
    {
    String URL = "http://YOURURL.COM";
    WebRequest request = WebRequest.Create(URL);
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }
    Console.WriteLine (String.Format("{0} : success",DateTime.Now));
    return html;
    }
    catch (Exception ex)
    {
        Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message));
        return "fail";
    }
}
raddevus
sumber
3

Menulis layanan ping / skrip untuk mengenai situs web idle Anda adalah cara terbaik untuk melakukannya karena Anda akan memiliki kontrol penuh. Opsi lain yang telah Anda sebutkan akan tersedia jika Anda telah menyewa kotak hosting khusus.

Di ruang hosting bersama, skrip pemanasan adalah pertahanan tingkat pertama terbaik (swadaya adalah bantuan terbaik). Berikut adalah artikel yang membagikan gagasan tentang cara melakukannya dari aplikasi web Anda sendiri .

David Chelliah
sumber
baru saja memperbarui utas lama ini, seandainya seseorang mencari hal yang sama
David Chelliah
2

Saya akan menggunakan B karena dalam hubungannya dengan daur ulang proses pekerja berarti hanya akan ada penundaan saat daur ulang. Ini menghindari penundaan yang biasanya dikaitkan dengan inisialisasi dalam menanggapi permintaan pertama setelah idle. Anda juga mendapatkan manfaat daur ulang.

Kit
sumber
2

Opsi yang baik untuk melakukan ping situs pada jadwal adalah menggunakan Microsoft Flow, yang gratis hingga 750 "berjalan" per bulan. Sangat mudah untuk membuat Flow yang mengenai situs Anda setiap jam agar tetap hangat. Anda bahkan dapat mengatasi batas 750 dengan membuat aliran tunggal dengan penundaan memisahkan beberapa klik situs Anda.

https://flow.microsoft.com

LMK
sumber
1

Lihat artikel ini untuk kiat tentang cara membantu masalah kinerja. Ini termasuk masalah kinerja yang terkait dengan memulai, di bawah bagian "mulai dingin". Sebagian besar dari ini akan menjadi masalah, apa pun jenis server yang Anda gunakan, secara lokal atau dalam produksi.

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

Jika aplikasi menghentikan deserialisasi apa pun dari XML (dan itu termasuk layanan web ...) pastikan SGEN dijalankan terhadap semua biner yang terlibat dalam deseriaisasi dan tempatkan DLL yang dihasilkan dalam Global Assembly Cache (GAC). Ini mengkompilasi semua objek serialisasi yang digunakan oleh majelis SGEN dijalankan melawan dan cache mereka di DLL yang dihasilkan. Ini dapat memberikan penghematan waktu yang sangat besar pada deserialisasi pertama (memuat) file konfigurasi dari disk dan panggilan awal ke layanan web. http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

Jika ada server IIS yang tidak memiliki akses keluar ke internet, matikan daftar Pencabutan Sertifikat (CRL) memeriksa biner Authenticode dengan menambahkan generatePublisherEvidence = "false" ke machine.config. Kalau tidak, setiap proses pekerja dapat menggantung selama lebih dari 20 detik selama start-up sementara waktu habis mencoba terhubung ke internet untuk mendapatkan daftar CRL. http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/library/bb629393.aspx

Pertimbangkan untuk menggunakan NGEN di semua majelis. Namun tanpa penggunaan yang hati-hati, ini tidak memberikan banyak keuntungan kinerja. Ini karena alamat pemuatan dasar dari semua binari yang dimuat oleh setiap proses harus hati-hati diatur pada waktu pembangunan untuk tidak tumpang tindih. Jika biner harus diubah ketika mereka dimuat karena bentrokan alamat, hampir semua keuntungan kinerja menggunakan NGEN akan hilang. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

nuzzolilo
sumber
0

Saya mendapatkan penundaan 15 detik yang konsisten pada permintaan pertama setelah 4 menit tidak aktif. Masalah saya adalah aplikasi saya menggunakan Otentikasi Terintegrasi Windows ke SQL Server dan profil layanan berada dalam domain yang berbeda dari server. Ini menyebabkan otentikasi lintas-domain dari IIS ke SQL saat inisialisasi aplikasi - dan ini adalah sumber nyata keterlambatan saya. Saya berubah menggunakan SQL login daripada otentikasi windows. Penundaan segera hilang. Saya masih memiliki semua pengaturan inisialisasi aplikasi untuk membantu meningkatkan kinerja tetapi mungkin tidak diperlukan sama sekali dalam kasus saya.

Droobie
sumber