Bagikan melalui


Mengontrol Konsumsi Sumber Daya dan Meningkatkan Performa

Topik ini menjelaskan berbagai properti di berbagai area arsitektur Windows Communication Foundation (WCF) yang berfungsi untuk mengontrol konsumsi sumber daya dan memengaruhi metrik performa.

Properti yang Membatasi Konsumsi Sumber Daya di WCF

Windows Communication Foundation (WCF) menerapkan batasan pada jenis proses tertentu untuk tujuan keamanan atau performa. Pembatasan ini datang dalam dua bentuk utama, kuota dan pembatasan. Kuota adalah batasan yang saat tercapai atau terlampaui memicu pengecualian langsung di beberapa titik dalam sistem. Pembatasan adalah batasan yang tidak segera menyebabkan pengecualian terjadi. Sebaliknya, saat batas pembatasan tercapai, pemrosesan berlanjut tetapi dalam batas yang ditetapkan oleh nilai pembatasan tersebut. Pemrosesan terbatas ini mungkin memicu pengecualian di tempat lain, tetapi ini tergantung pada aplikasi.

Selain perbedaan antara kuota dan pembatasan, beberapa properti yang membatasi terletak di tingkat serialisasi, beberapa di tingkat transportasi, dan beberapa di tingkat aplikasi. Misalnya, kuota TransportBindingElement.MaxReceivedMessageSize, yang diimplementasikan oleh semua elemen pengikatan transportasi yang disediakan sistem, diatur ke 65.536 byte secara default untuk menghalangi klien jahat terlibat dalam penolakan serangan layanan terhadap layanan dengan menyebabkan konsumsi memori yang berlebihan. (Biasanya, Anda dapat meningkatkan performa dengan menurunkan nilai ini.)

Contoh kuota serialisasi adalah properti DataContractSerializer.MaxItemsInObjectGraph, yang menentukan jumlah maksimum objek yang diserialisasikan atau dibatalkan serialisasinya oleh serializer dalam satu panggilan metode ReadObject. Contoh pembatasan tingkat aplikasi adalah properti ServiceThrottle.MaxConcurrentSessions, yang secara default membatasi jumlah koneksi saluran sesi bersamaan menjadi 10. (Tidak seperti kuota, jika nilai pembatasan ini tercapai, aplikasi terus memproses tetapi tidak menerima saluran sesi baru, yang berarti bahwa klien baru tidak dapat terhubung sampai salah satu saluran sesi lainnya berakhir.)

Kontrol ini dirancang untuk memberikan mitigasi siap pakai terhadap jenis serangan tertentu atau untuk meningkatkan metrik performa seperti jejak memori, waktu mulai, dan sebagainya. Namun, tergantung pada aplikasi, kontrol ini dapat menghambat performa aplikasi layanan atau mencegah aplikasi bekerja sama sekali. Misalnya, aplikasi yang dirancang untuk melakukan streaming video dapat dengan mudah melebihi properti TransportBindingElement.MaxReceivedMessageSize default. Topik ini memberikan gambaran umum tentang berbagai kontrol yang diterapkan pada aplikasi di semua tingkat WCF, menjelaskan berbagai cara untuk mendapatkan informasi selengkapnya tentang apakah pengaturan menghambat aplikasi Anda, dan menjelaskan cara untuk memperbaiki berbagai masalah. Sebagian besar pembatasan dan beberapa kuota tersedia di tingkat aplikasi, bahkan saat properti dasar merupakan pembatasan serialisasi atau transportasi. Misalnya, Anda dapat mengatur properti DataContractSerializer.MaxItemsInObjectGraph menggunakan properti ServiceBehaviorAttribute.MaxItemsInObjectGraph pada kelas layanan.

Catatan

Jika memiliki masalah tertentu, Anda harus terlebih dahulu membaca Mulai Cepat Pemecahan Masalah WCF untuk melihat apakah masalah Anda (dan solusi) tercantum di sana.

Properti yang membatasi proses serialisasi tercantum dalam Pertimbangan Keamanan untuk Data. Properti yang membatasi konsumsi sumber daya yang terkait dengan transportasi tercantum dalam Kuota Transportasi. Properti yang membatasi konsumsi sumber daya di lapisan aplikasi adalah anggota kelas ServiceThrottle.

Default nilai sebelumnya telah dipilih untuk mengaktifkan fungsionalitas aplikasi dasar di berbagai jenis aplikasi sambil memberikan perlindungan dasar terhadap masalah keamanan umum. Namun, desain aplikasi yang berbeda mungkin melebihi satu atau beberapa pengaturan pembatasan meskipun aplikasi tersebut aman dan akan berfungsi seperti yang dirancang. Dalam kasus ini, Anda harus mengidentifikasi nilai pembatasan mana yang terlampaui dan pada tingkat apa, dan memutuskan tindakan yang sesuai untuk meningkatkan throughput aplikasi.

Biasanya, saat menulis aplikasi dan mendebugnya, Anda mengatur properti ServiceDebugBehavior.IncludeExceptionDetailInFaults ke true dalam file konfigurasi atau secara terprogram. Ini menginstruksikan WCF untuk mengembalikan jejak tumpukan pengecualian layanan ke aplikasi klien untuk dilihat. Fitur ini melaporkan sebagian besar pengecualian tingkat aplikasi sedemikian rupa untuk menampilkan pengaturan kuota mana yang mungkin terlibat, jika itu masalahnya.

Beberapa pengecualian terjadi pada durasi di bawah visibilitas lapisan aplikasi dan tidak dikembalikan menggunakan mekanisme ini, dan mungkin tidak ditangani oleh implementasi System.ServiceModel.Dispatcher.IErrorHandler kustom. Jika Anda berada dalam lingkungan pengembangan seperti Microsoft Visual Studio, sebagian besar pengecualian ini ditampilkan secara otomatis. Namun, beberapa pengecualian dapat ditutupi oleh pengaturan lingkungan pengembangan seperti Just My Code Visual Studio.

Terlepas dari kemampuan lingkungan pengembangan Anda, Anda dapat menggunakan kemampuan pelacakan WCF dan pengelogan pesan untuk mendebug semua pengecualian dan menyetel performa aplikasi Anda. Untuk mengetahui informasi selengkapnya, lihat Menggunakan Pelacakan untuk Memecahkan Masalah Aplikasi Anda.

Masalah Performa dan XmlSerializer

Aplikasi layanan dan klien yang menggunakan jenis data yang dapat diserialisasikan menggunakan XmlSerializer membuat dan mengompilasi kode serialisasi untuk jenis data tersebut pada durasi, yang dapat menghasilkan performa start-up yang lambat.

Catatan

Kode serialisasi yang dibuat sebelumnya hanya dapat digunakan dalam aplikasi klien dan bukan di layanan.

Alat Utilitas Metadata ServiceModel (Svcutil.exe) dapat meningkatkan performa start-up untuk aplikasi ini dengan menghasilkan kode serialisasi yang diperlukan dari assembly yang dikompilasi untuk aplikasi. Untuk informasi selengkapnya, lihat Cara: Meningkatkan Waktu Startup dari Aplikasi Klien WCF yang menggunakan XmlSerializer.

Masalah Performa Saat Menghosting Layanan WCF di bawah ASP.NET

Saat layanan WCF dihosting di bawah IIS dan ASP.NET, pengaturan konfigurasi IIS dan ASP.NET dapat memengaruhi throughput dan jejak memori layanan WCF. Untuk mengetahui informasi selengkapnya tentang performa ASP.NET, lihat Meningkatkan Performa ASP.NET. Salah satu pengaturan yang mungkin memiliki konsekuensi yang tidak diinginkan adalah MinWorkerThreads, yang merupakan properti ProcessModelSection. Jika aplikasi Anda memiliki klien tetap atau dengan jumlah kecil, pengaturan MinWorkerThreads ke 2 mungkin memberikan peningkatan throughput pada mesin multiprosedur yang memiliki pemanfaatan CPU mendekati 100%. Peningkatan performa ini dilengkapi dengan biaya: ini juga akan menyebabkan peningkatan penggunaan memori, yang dapat mengurangi skalabilitas.

Lihat juga