Mengapa setelah setiap restart, situs .NET lokal saya memerlukan waktu untuk memuat untuk pertama kalinya? [Tutup]

27

Saya sedang mengembangkan situs berdasarkan platform .NET. Saya biasanya menggunakan situs-situs ini di IIS lokal saya, sehingga saya bisa mengujinya dan melihat fungsinya sebelum ditayangkan. Namun, setiap kali saya me-restart windows, sepertinya situs membutuhkan waktu lama untuk berjalan untuk pertama kalinya.

Saya tahu tentang JIT dan saya juga mengetahui pertanyaan ini , tetapi tidak menjawab pertanyaan saya.

Apakah JIT terjadi setiap kali Anda me-restart windows? Apakah ini terkait dengan pembuatan proses w3wp.exe? Mengapa situs sangat lambat untuk permintaan pertama setelah setiap restart?

Saeed Neamati
sumber
3
Ini dikenal sebagai "awal yang dingin" atau sesuatu. Sistem harus memuat w3wp ke dalam memori, yang juga membutuhkan semua dll yang terkait, mungkin hal-hal JIT, proses tabel impor, membaca data dari disk, karena tidak ada dalam cache RAM, dll.
Coder
@Coder, +1 untuk komentar Anda. Tapi bisakah Anda menjelaskan lebih dalam jawaban, sehingga saya dan pengembang lain akan menggunakan manfaat. :)
Saeed Neamati
IIS bukan spesialisasi saya, jadi saya berharap seseorang akan memberikan jawaban yang lebih baik. Berikut adalah topik serupa yang saya mulai beberapa saat yang lalu stackoverflow.com/questions/3807791/cold-startup-optimization Mungkin ini akan membantu lebih banyak lagi.
Coder
4
Pertanyaan ini tampaknya di luar topik karena ini adalah masalah implementasi dan bukan masalah pemrograman konseptual.

Jawaban:

32

Masalah ini adalah kompilasi JIT. Kumpulan aplikasi membutuhkan waktu untuk membangun perpustakaan sebelum dapat mulai memprosesnya. Ini dapat dipercepat dengan menggunakan skrip pemanasan, tetapi itu adalah sesuatu yang perlu terjadi. Itu juga tergantung pada apakah Anda menggunakan situs web atau proyek aplikasi web. Sebuah situs web adalah JIT untuk setiap halaman sehingga klik pertama lambat dan setiap klik halaman baru memiliki waktu kompilasi tambahan juga. Proyek-proyek aplikasi web sudah dikompilasi jadi seharusnya tidak menderita hit ini sebagai buruk, tetapi perpustakaan masih perlu dimuat. Semakin banyak perpustakaan / alat yang Anda miliki, semakin buruk kemungkinan hasil ini. Berikut ini beberapa tautan yang membahas pemanasan:

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://blogs.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx /programming/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-skrip /

Joel Etherton
sumber
6
Ini sebagian besar benar tetapi ada perbedaan antara kompilasi dan jitting yang tidak jelas dalam jawaban ini. Jitting mengkompilasi bytecode .NET ke kode mesin. ASP.NET sebenarnya mengkompilasi halaman web tersebut, bahkan dalam Proyek Aplikasi Web (kecuali Anda menggunakan aspnet_compiler). Semua waktu kompilasi / pembangunan, ditambah waktu pemuatan jitting dan library, adalah mengapa sangat lambat.
Aaronaught
JIT hanya singkatan dari just-in-time. Tidak ada perbedaan antara "jitting" dan "compiling", di luar waktu dan jumlah kode yang dikompilasi. Juga, kompilasi JIT hanya terjadi untuk setiap kode yang belum dikunjungi , tidak harus untuk setiap halaman. Jika mereka menggunakan template yang sama, mis. Kompilasi tidak diperlukan. Pernyataan bahwa lebih banyak perpustakaan menyebabkan lebih banyak waktu yang dibutuhkan untuk mengkompilasi, tentu saja benar.
Cornelius
9

Reaksi lambat pada permintaan pertama Anda adalah karena IIS hanya memulai / memuat kumpulan situs atau aplikasi pada permintaan masuk pertama itu. Dan setelah jangka waktu tertentu tidak ada permintaan masuk baru yang tiba di server IIS menghentikan situs lagi (daur ulang kumpulan aplikasi).

ASP.NET 4.0 memiliki fitur baru yang disebut auto-start. Dengan fitur ini Anda dapat mengatur kumpulan aplikasi atau situs individual untuk memulai sendiri sebelum permintaan apa pun. Ini dipicu pada saat boot (ketika IIS mulai) atau ketika Anda memperbarui situs ASP.NET (yang menghentikan situs).

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

Anda perlu IIS 7.5 untuk menggunakan ini.

Ada juga opsi untuk melakukan tugas-tugas tambahan tertentu ketika mulai otomatis tendangan masuk, ex. untuk memuat data ke dalam cache.

Stief
sumber
Biasanya Anda mengkompilasi situs lengkap Anda sebelum meletakkannya di server web, sehingga kode tidak perlu dikompilasi lagi pada permintaan pertama. JIT hanya digunakan untuk situs-situs yang menggunakan folder App_code tempat Anda mempublikasikan kode sumber Anda dengan situs web.
Stief
2

Bagian dari masalah juga GAC. Perpustakaan tempat perlu ada keamanan diperiksa setiap kali mereka dimuat - itu berarti seluruh beban pekerjaan jenis enkripsi sedang dilakukan, dan ini memperlambat banyak hal. Ada pembicaraan tentang kinerja WPF beberapa waktu lalu dari MS yang menggambarkan masalah ini - jawaban mereka adalah "jangan menaruh barang di GAC jika Anda tidak bisa menahannya"

gbjbaanb
sumber
1
Itu seharusnya "dapat membantu" untuk menghindari negatif ganda
Richard Szalay