Pertengkaran, kinerja yang buruk dan kebuntuan ketika Anda membuat panggilan ke Layanan Web dari aplikasi ASP.NET

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 821268 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

Gejala

Ketika Anda membuat panggilan ke Layanan Web dari Microsoft ASP.NET aplikasi, Anda mungkin mengalami pertengkaran, kinerja yang buruk dan kebuntuan. Klien dapat melaporkan bahwa permintaan berhenti merespons (atau "hang") atau mengambil waktu yang sangat lama untuk mengeksekusi. Jika kebuntuan diduga, proses pekerja mungkin daur ulang. Anda mungkin menerima pesan berikut di log aktivitas aplikasi.
  • Jika Anda menggunakan Internet Information Services (IIS) 5.0, Anda menerima pesan berikut di log aplikasi:

       Event Type:     Error
       Event Source:   ASP.NET 1.0.3705.0
       Event Category: None
       Event ID:       1003
       Date:           5/4/2003
       Time:           6:18:23 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          aspnet_wp.exe  (PID: <xxx>) was recycled because it was suspected to be in a deadlocked state.
          It did not send any responses for pending requests in the last 180 seconds.

  • Jika Anda menggunakan IIS 6.0, Anda menerima pesan berikut di log aplikasi:

       Event Type:     Warning
       Event Source:   W3SVC-WP
       Event Category: None
       Event ID:       2262
       Date:           5/4/2003
       Time:           1:02:33 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          ISAPI 'C:\Windows\Microsoft.net\Framework\v.1.1.4322\aspnet_isapi.dll' reported itself as
          unhealthy for the following reason: 'Deadlock detected'.

  • Jika Anda menggunakan IIS 6.0, Anda menerima pesan berikut di log sistem:

       Event Type:     Warning
       Event Source:   W3SVC
       Event Category: None
       Event ID:       1013
       Date:           5/4/2003
       Time:           1:03:47 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          A process serving application pool 'DefaultAppPool' exceeded time limits during shut down.
          The process id was '<xxxx>'.

Anda mungkin juga menerima galat pengecualian berikut pesan Anda membuat panggilan ke HttpWebRequest.GetResponse metode:
"System.InvalidOperationException: Tidak ada thread gratis cukup dalam objek ThreadPool untuk menyelesaikan operasi."
Anda mungkin juga menerima pesan galat berikut pengecualian dalam browser:
"HttpException (0x80004005): permintaan timed keluar."
Catatan Artikel ini juga berlaku untuk aplikasi yang membuat permintaan HttpWebRequest langsung.

Penyebab

Masalah ini mungkin terjadi karena ASP.NET membatasi nomor Thread pekerja dan penyelesaian port benang yang panggilan dapat digunakan untuk mengeksekusi permintaan.

Biasanya, panggilan untuk Layanan Web menggunakan satu thread pekerja untuk mengeksekusi kode yang mengirim permintaan dan satu penyelesaian port thread untuk menerima panggilan balik dari Layanan Web. Namun, jika permintaan diarahkan atau memerlukan otentikasi, panggilan dapat menggunakan sebanyak dua thread pekerja dan dua penyelesaian port benang. Oleh karena itu, Anda dapat buang ThreadPool dikelola ketika beberapa Layanan Web panggilan terjadi pada waktu yang sama.

Misalnya, bahwa ThreadPool terbatas untuk 10 thread pekerja dan bahwa semua thread pekerja 10 saat ini yang mengeksekusi kode yang menunggu untuk callback untuk mengeksekusi. Callback bisa pernah menjalankan, karena setiap item pekerjaan yang antri untuk ThreadPool diblokir sampai thread menjadi tersedia.

Potensial lain sumber pertikaian adalah parameter maxconnection yang menggunakan System.Net namespace untuk membatasi jumlah koneksi. Umumnya, batas ini bekerja seperti yang diharapkan. Namun, jika banyak aplikasi mencoba untuk membuat banyak permintaan untuk satu alamat penyuratan IP pada saat yang sama, benang mungkin harus menunggu koneksi yang tersedia.

Pemecahan masalah

Untuk mengatasi masalah ini, Anda dapat menyetel parameter berikut di file Machine.config untuk terbaik sesuai dengan situasi Anda:
  • maxWorkerThreads
  • minWorkerThreads
  • maxIoThreads
  • minFreeThreads
  • minLocalRequestFreeThreads
  • maxconnection
  • executionTimeout
Untuk berhasil mengatasi masalah ini, mengambil tindakan berikut:
  • Batas jumlah permintaan ASP.NET yang dapat mengeksekusi di saat yang sama untuk sekitar 12 per CPU.
  • Izin Web Layanan callback untuk secara bebas menggunakan benang di ThreadPool.
  • Pilih nilai yang sesuai untuk maxconnections parameter. Pilihan Anda berdasarkan jumlah alamat penyuratan IP dan AppDomains yang digunakan.
Catatan Rekomendasi untuk membatasi jumlah permintaan ASP.NET-12 per CPU adalah agak sewenang-wenang. Namun, batas ini telah terbukti bekerja dengan baik untuk sebagian besar aplikasi.

maxWorkerThreads dan maxIoThreads

ASP.NET menggunakan pengaturan konfigurasi dua berikut untuk membatasi jumlah maksimum thread pekerja dan penyelesaian benang yang digunakan:
<processModel maxWorkerThreads="20" maxIoThreads="20">
MaxWorkerThreads parameter dan maxIoThreads parameter yang secara implisit dikalikan dengan jumlah CPU. Untuk Misalnya, jika Anda memiliki dua prosesor, jumlah maksimum thread pekerja adalah berikut:
2 * maxWorkerThreads

minFreeThreads dan minLocalRequestFreeThreads

ASP.NET juga berisi konfigurasi berikut pengaturan yang menentukan berapa banyak thread pekerja dan penyelesaian port benang harus tersedia untuk memulai permintaan remote atau lokal permintaan:
<httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8">
Jika ada tidak cukup benang yang tersedia, permintaan antri sampai cukup benang gratis untuk membuat permintaan. Oleh karena itu, ASP.NET akan tidak melaksanakan lebih dari berikut jumlah permintaan pada saat yang sama:
(maxWorkerThreads*jumlah CPU)-minFreeThreads
CatatanMinFreeThreads parameter dan minLocalRequestFreeThreads parameter yang tidak secara implisit dikalikan dengan jumlah CPU.

minWorkerThreads

ASP.NET 1.0 Service Pack 3 dan ASP.NET 1.1, ASP.NET juga berisi pengaturan konfigurasi berikut yang menentukan bagaimana banyak pekerja benang dapat dibuat tersedia segera untuk layanan remote permintaan.
<processModel minWorkerThreads="1">
Threads yang dikendalikan oleh ini pengaturan dapat dibuat di tingkat yang jauh lebih cepat daripada Thread pekerja yang dibuat dari yang dimiliki oleh CLR default "thread-tuning" kemampuan. Pengaturan ini memungkinkan ASP.NET untuk Layanan Pertanyaan yang mungkin tiba-tiba mengisi antrian permintaan ASP.NET karena lambat-down pada back-end server, tiba-tiba ledakan permintaan dari klien akhir, atau sesuatu yang serupa yang akan menyebabkan peningkatan mendadak dalam jumlah permintaan dalam antrian. The nilai asali untuk minWorkerThreads parameter adalah 1. Kami merekomendasikan bahwa Anda tetapkan nilai untuk minWorkerThreads parameter ke nilai berikut.
minWorkerThreads = maxWorkerThreads / 2
secara asali, minWorkerThreads parameter tidak hadir dalam baik file Web.config atau Machine.config file. Pengaturan ini secara implisit dikalikan dengan jumlah CPU.

maxconnection

Maxconnection parameter menentukan berapa banyak koneksi dapat dibuat untuk alamat penyuratan IP tertentu. Parameter muncul sebagai berikut:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://65.53.32.230" maxconnection="12">
</connectionManagement>
Jika kode aplikasi referensi aplikasi oleh hostname bukan alamat penyuratan IP, parameter harus muncul sebagai berikut:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://hostname" maxconnection="12">
</connectionManagement>
Akhirnya, jika aplikasi host pada port selain 80, parameter harus mencakup pelabuhan non-standar di URI, mirip dengan berikut:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://hostname:8080" maxconnection="12">
</connectionManagement>
Pengaturan untuk parameter yang dibahas sebelumnya dalam artikel ini adalah semua di tingkat proses. Namun, pengaturan parameter maxconnection berlaku untuk tingkat AppDomain. secara asali, karena pengaturan ini berlaku untuk tingkat AppDomain, Anda dapat membuat hingga maksimum dua koneksi ke alamat penyuratan IP khusus dari setiap AppDomain di Anda proses.

executionTimeout

ASP.NET menggunakan pengaturan konfigurasi berikut untuk batas waktu eksekusi permintaan:
<httpRuntime executionTimeout="90"/>
Anda juga dapat menetapkan batas ini dengan menggunakan properti Server.ScriptTimeout .

Catatan Jika Anda meningkatkan nilai executionTimeout parameter, Anda mungkin juga harus memodifikasi processModel responseDeadlockInterval pengaturan parameter.

Rekomendasi

Pengaturan yang disarankan di bagian ini tidak dapat bekerja untuk Semua aplikasi. Namun, informasi tambahan berikut dapat membantu Anda untuk membuat penyesuaian yang tepat.

Jika Anda membuat satu Web layanan panggilan ke satu alamat penyuratan IP dari setiap halaman ASPX, Microsoft menganjurkan bahwa Anda menggunakan pengaturan konfigurasi berikut:
  • Set nilai-nilai maxWorkerThreads parameter dan maxIoThreads parameter ke 100.
  • Menetapkan nilai maxconnection parameter untuk 12 *N (di mana N adalah jumlah CPU yang Anda memiliki).
  • Mengatur nilai-nilai parameter minFreeThreads ke 88 *N dan parameter minLocalRequestFreeThreads untuk76 *N.
  • Set nilai minWorkerThreads ke 50. Ingat, minWorkerThreads tidak di file konfigurasi secara asali. Anda harus menambahkannya.
Beberapa rekomendasi ini melibatkan rumus sederhana yang melibatkan jumlah CPU pada server. Variabel yang mewakili jumlah CPU di rumus adalah N. Untuk pengaturan ini, jika Anda memiliki hyperthreading diaktifkan, Anda harus menggunakan jumlah CPU logis bukan jumlah CPU fisik. Misalnya, jika Anda memiliki server empat-prosesor dengan hyperthreading diaktifkan, maka nilai N dalam rumus akan 8 bukannya 4.

Catatan Ketika Anda menggunakan konfigurasi ini, Anda bisa menjalankan maksimal 12 ASP.NET permintaan per CPU pada saat yang sama karena 100-88 = 12. Oleh karena itu, setidaknya 88 *N pekerja benang dan 88 *N penyelesaian port benang tersedia untuk lain menggunakan (seperti Web Layanan callback).

Sebagai contoh, Anda memiliki sebuah server dengan empat prosesor dan hyperthreading diaktifkan. Berdasarkan rumus ini, Anda akan menggunakan nilai berikut untuk pengaturan konfigurasi yang disebutkan dalam artikel ini.
<system.web>
	<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
	<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>

<system.net>
	<connectionManagement>
		<add address="[ProvideIPHere]" maxconnection="96"/>
	</connectionManagement>
</system.net>

Juga, ketika Anda menggunakan konfigurasi ini, sambungan 12 tersedia per CPU per alamat penyuratan IP untuk setiap AppDomain. Oleh karena itu, dalam berikut skenario, sangat sedikit pertikaian terjadi ketika permintaan sedang menunggu sambungan, dan ThreadPool tidak habis:
  • Web host hanya satu aplikasi (AppDomain).
  • Setiap permintaan untuk halaman ASPX membuat satu Layanan Pertanyaan Web.
  • Semua permintaan adalah alamat penyuratan IP yang sama.
Namun, bila Anda menggunakan konfigurasi ini, skenario yang melibatkan salah satu mungkin akan menggunakan terlalu banyak koneksi:
  • Permintaan akan beberapa alamat penyuratan IP.
  • Permintaan yang dialihkan (kode 302 status).
  • Permintaan memerlukan otentikasi.
  • Permintaan yang terbuat dari beberapa AppDomains.
Dalam skenario ini, itu adalah ide yang baik untuk menggunakan nilai yang lebih rendah untuk maxconnection parameter dan lebih tinggi nilai untuk minFreeThreads parameter dan minLocalRequestFreeThreads parameter.

Status

Ini perilaku adalah dengan desain.

Informasi lebih lanjut

Jika Anda mengalami kinerja yang buruk dan pertikaian mengenai IIS 7,0 bersama dengan ASP.NET, pergi ke blog Microsoft berikut:
ASP.NET Thread penggunaan IIS 7,5, IIS 7,0 dan IIS 6.0

ASP.net menggantung di IIS 7,0

Referensi

Untuk informasi lebih lanjut, kunjungi website Microsoft Developer Network (MSDN) berikut:
Meningkatkan kinerja ASP.NET

Properti

ID Artikel: 821268 - Kajian Terakhir: 06 Februari 2013 - Revisi: 3.0
Berlaku bagi:
  • Microsoft .NET Framework 2.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Kata kunci: 
kbprb kbmt KB821268 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini: 821268

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com