Tidak, jawaban untuk pertanyaan kedua saya bukanlah musim dingin.
Kata pengantar:
Saya telah melakukan banyak penelitian tentang Entity Framework baru-baru ini dan sesuatu yang terus mengganggu saya adalah kinerjanya saat kueri tidak dipanaskan, yang disebut cold queries.
Saya membaca artikel pertimbangan kinerja untuk Entity Framework 5.0. Penulis memperkenalkan konsep pertanyaan Hangat dan Dingin dan bagaimana perbedaannya, yang juga saya perhatikan sendiri tanpa mengetahui keberadaannya. Di sini mungkin layak untuk disebutkan bahwa saya hanya memiliki pengalaman enam bulan di belakang saya.
Sekarang saya tahu topik apa yang dapat saya teliti tambahan jika saya ingin memahami kerangka kerja lebih baik dalam hal kinerja. Sayangnya sebagian besar informasi di Internet sudah usang atau membengkak dengan subjektivitas, oleh karena itu saya tidak dapat menemukan informasi tambahan tentang topik kueri Warm vs Cold .
Pada dasarnya apa yang saya perhatikan sejauh ini adalah bahwa setiap kali saya harus mengkompilasi ulang atau mendaur ulang, kueri awal saya menjadi sangat lambat. Setiap pembacaan data berikutnya cepat ( subyektif ), seperti yang diharapkan.
Kami akan bermigrasi ke Windows Server 2012, IIS8 dan SQL Server 2012 dan sebagai Junior saya benar-benar memenangkan kesempatan untuk mengujinya sebelum yang lain. Saya sangat senang mereka memperkenalkan modul pemanasan yang akan membuat aplikasi saya siap untuk permintaan pertama itu. Namun, saya tidak yakin bagaimana melanjutkan dengan pemanasan Kerangka Kerja Entitas saya.
Apa yang sudah saya ketahui layak dilakukan:
- Hasilkan Tampilan saya sebelumnya seperti yang disarankan.
- Akhirnya pindahkan model saya ke rakitan terpisah.
Apa yang saya pertimbangkan untuk dilakukan, dengan mengikuti akal sehat, mungkin pendekatan yang salah :
- Melakukan pembacaan data dummy di Application Start untuk menghangatkan, menghasilkan, dan memvalidasi model.
Pertanyaan:
- Apa pendekatan terbaik untuk mendapatkan ketersediaan tinggi di Kerangka Kerja Entitas saya kapan saja?
- Dalam kasus apa Entity Framework menjadi "dingin" lagi? (Kompilasi Ulang, Daur Ulang, IIS Restart dll.)
Jawaban:
Anda dapat memilih campuran tampilan yang dibuat sebelumnya dan kueri kompilasi statis.
Static CompiledQuerys bagus karena cepat dan mudah ditulis serta membantu meningkatkan kinerja. Namun dengan EF5 tidak perlu mengkompilasi semua kueri Anda karena EF akan mengompilasi kueri itu sendiri secara otomatis. Satu-satunya masalah adalah kueri ini bisa hilang saat cache disapu. Jadi, Anda masih ingin menyimpan referensi ke kueri yang Anda kompilasi sendiri untuk kueri yang terjadi sangat jarang, tetapi itu mahal. Jika Anda menempatkan kueri tersebut ke dalam kelas statis, kueri tersebut akan dikompilasi saat pertama kali diperlukan. Ini mungkin sudah terlambat untuk beberapa kueri, jadi Anda mungkin ingin memaksa kompilasi kueri ini selama startup aplikasi.
Melihat sebelumnya adalah kemungkinan lain seperti yang Anda sebutkan. Terutama, untuk kueri yang membutuhkan waktu sangat lama untuk dikompilasi dan tidak berubah. Dengan cara itu Anda memindahkan overhead kinerja dari waktu proses ke waktu kompilasi. Juga ini tidak akan menyebabkan keterlambatan. Tapi tentu saja perubahan ini masuk ke database, jadi tidak mudah untuk mengatasinya. Kode lebih fleksibel.
Jangan gunakan banyak warisan TPT (itu masalah kinerja umum di EF). Jangan membangun hierarki warisan Anda terlalu dalam atau terlalu lebar. Hanya 2-3 properti khusus untuk beberapa kelas mungkin tidak cukup untuk meminta tipe sendiri, tetapi dapat ditangani sebagai properti opsional (nullable) untuk tipe yang ada.
Jangan berpegang pada satu konteks untuk waktu yang lama. Setiap contoh konteks memiliki cache tingkat pertama sendiri yang memperlambat kinerja saat tumbuh lebih besar. Pembuatan konteks itu murah, tetapi pengelolaan negara di dalam entitas yang di-cache dari konteks itu mungkin menjadi mahal. Cache lainnya (rencana kueri dan metadata) dibagikan antar konteks dan akan mati bersama dengan AppDomain.
Secara keseluruhan, Anda harus memastikan untuk sering mengalokasikan konteks dan menggunakannya hanya untuk waktu yang singkat, bahwa Anda dapat memulai aplikasi dengan cepat, bahwa Anda mengompilasi kueri yang jarang digunakan dan memberikan tampilan yang dibuat sebelumnya untuk kueri yang sangat penting bagi kinerja dan sering digunakan.
Pada dasarnya, setiap kali Anda kehilangan AppDomain Anda. IIS melakukan restart setiap 29 jam , jadi Anda tidak pernah dapat menjamin bahwa Anda akan memiliki instans Anda. Juga setelah beberapa waktu tanpa aktivitas, AppDomain juga akan dimatikan. Anda harus mencoba untuk segera kembali. Mungkin Anda dapat melakukan beberapa inisialisasi secara asynchronous (tapi waspadalah terhadap masalah multi-threading). Anda dapat menggunakan tugas terjadwal yang memanggil halaman dummy dalam aplikasi Anda pada saat tidak ada permintaan untuk mencegah AppDomain mati, tetapi pada akhirnya akan mati.
Saya juga berasumsi ketika Anda mengubah file konfigurasi atau mengubah majelis, akan ada restart.
sumber
Jika Anda mencari kinerja maksimum di semua panggilan, Anda harus mempertimbangkan arsitektur Anda dengan hati-hati. Misalnya, mungkin masuk akal untuk melakukan pra-cache yang sering digunakan pencarian di RAM server saat aplikasi dimuat daripada menggunakan panggilan database pada setiap permintaan. Teknik ini akan memastikan waktu respons aplikasi minimum untuk data yang umum digunakan. Namun, Anda harus yakin memiliki kebijakan kedaluwarsa yang berperilaku baik atau selalu menghapus cache Anda setiap kali ada perubahan yang memengaruhi data cache untuk menghindari masalah dengan konkurensi.
Secara umum, Anda harus berusaha merancang arsitektur terdistribusi agar hanya memerlukan permintaan data berbasis IO ketika informasi yang disimpan dalam cache secara lokal menjadi basi, atau perlu transaksional. Setiap permintaan data "over the wire" biasanya membutuhkan waktu 10-1000 kali lebih lama untuk diambil daripada permintaan data lokal dalam pengambilan cache memori. Fakta yang satu ini saja sering membuat diskusi tentang "data dingin vs. hangat" tidak penting dibandingkan dengan masalah data "lokal vs. jarak jauh".
sumber
Kiat umum.
Sekarang untuk menjelaskan mengapa permintaan dummy bukanlah pendekatan yang salah .
Untuk menjelaskan kapan cache menjadi "Dingin".
Ini terjadi di setiap lapisan dalam kerangka Anda yang menerapkan cache, ada deskripsi yang bagus di bagian atas halaman kinerja .
Hal lain yang Anda sebutkan, khususnya rekompilasi dan restart IIS menghapus sebagian atau semua cache memori.
sumber
Seperti yang telah Anda nyatakan, gunakan "tampilan yang dibuat sebelumnya" yang benar-benar perlu Anda lakukan.
Diekstrak dari tautan Anda : "Saat tampilan dibuat, mereka juga divalidasi. Dari sudut pandang kinerja, sebagian besar biaya pembuatan tampilan sebenarnya adalah validasi tampilan"
Ini berarti ketukan kinerja akan terjadi saat Anda membangun perakitan model Anda. Objek konteks Anda kemudian akan melewati "kueri dingin" dan tetap responsif selama durasi siklus hidup objek konteks serta konteks objek baru berikutnya.
Menjalankan kueri yang tidak relevan tidak akan melayani tujuan lain selain untuk mengonsumsi sumber daya sistem.
Jalan pintas ...
sumber
Saya tidak punya pengalaman dalam kerangka ini. Tetapi dalam konteks lain, misalnya Solr, pembacaan yang benar-benar palsu tidak akan banyak berguna kecuali Anda dapat menyimpan cache seluruh DB (atau indeks).
Pendekatan yang lebih baik adalah dengan mencatat kueri, mengekstrak yang paling umum dari log dan menggunakannya untuk pemanasan. Pastikan untuk tidak mencatat kueri pemanasan atau menghapusnya dari log sebelum melanjutkan.
sumber