it-swarm-id.com

Apa yang membatasi # koneksi simultan yang dapat dilakukan oleh aplikasi ASP.NET saya ke layanan web?

Saya memiliki aplikasi ASP.NET 4.0 yang berjalan di atas IIS 7.5 pada mesin Windows Server 2008 R2 Enterprise 64-bit dengan sekumpulan RAM, CPU, disk, dll.

Dengan setiap permintaan web, aplikasi ASP.NET membuat koneksi ke layanan web backend (melalui soket mentah), yang berjalan pada mesin yang sama.

Masalah: Tampaknya ada sesuatu yang membatasi # koneksi simultan ke layanan web backend. Yang mencurigakan, jumlah koneksi bersamaan mencapai 16.

Saya menemukan artikel kunci ini dari Microsoft yang menjelaskan cara mengatur pengaturan IIS untuk mengakomodasi aplikasi ASP.NET yang membuat banyak permintaan layanan web: http://support.Microsoft.com/?id=821268#tocHeadRef =

Saya mengikuti rekomendasi artikel itu, tetapi masih belum berhasil. Pengaturan yang sangat menarik adalah pengaturan maxconnection, yang saya bahas 999.

Ada ide apa yang lain bisa menjadi penghambat koneksi

Catatan: Ketika saya memotong IIS dari campuran dan membuat klien terhubung langsung ke layanan web backend, itu akan dengan senang hati terbuka koneksi sebanyak yang saya butuhkan, jadi saya yakin backend bukan hambatan. Pasti ada sesuatu di IIS/ASP.NET-land.

Inilah bagian yang relevan dari machine.config yang saya yakin sedang dibaca oleh aplikasi (diverifikasi dengan appcmd.exe):

<system.web>
    <processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />
    <httpRuntime minFreeThreads="176" minLocalRequestFreeThreads="152"/>

    <httpHandlers />

    <membership>
        <providers>
            <add name="AspNetSqlMembershipProvider"
                type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                connectionStringName="LocalSqlServer"
                enablePasswordRetrieval="false"
                enablePasswordReset="true"
                requiresQuestionAndAnswer="true"
                applicationName="/"
                requiresUniqueEmail="false"
                passwordFormat="Hashed"
                maxInvalidPasswordAttempts="5"
                minRequiredPasswordLength="7"
                minRequiredNonalphanumericCharacters="1"
                passwordAttemptWindow="10"
                passwordStrengthRegularExpression="" />
        </providers>
    </membership>

    <profile>
        <providers>
            <add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/"
                type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </profile>

    <roleManager>
        <providers>
            <add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/"
                type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            <add name="AspNetWindowsTokenRoleProvider" applicationName="/"
                type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </roleManager>
</system.web>
<system.net>
    <connectionManagement>
        <add address="*" maxconnection="999"/>
    </connectionManagement>
</system.net>
86
Rob Sobers

Sebagian besar jawaban yang diberikan di sini membahas jumlah permintaan masuk ke layanan web backend Anda, bukan jumlah permintaan keluar yang dapat Anda buat dari aplikasi ASP.net Anda ke layanan backend Anda.

Bukan layanan web backend Anda yang membatasi kecepatan permintaan Anda di sini, itu adalah jumlah koneksi terbuka yang ingin dibuat oleh aplikasi panggilan Anda ke titik akhir yang sama (URL yang sama).

Anda dapat menghapus batasan ini dengan menambahkan bagian konfigurasi berikut ke file machine.config Anda:

<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="65535"/>
    </connectionManagement>
  </system.net>
</configuration>

Anda tentu saja dapat memilih nomor yang lebih masuk akal jika Anda ingin seperti 50 atau 100 koneksi bersamaan. Tapi di atas akan membukanya hingga maks. Anda juga dapat menentukan alamat khusus untuk aturan batas terbuka di atas daripada '*' yang menunjukkan semua alamat.

Dokumentasi MSDN untuk System.Net.connectionManagement

Sumber Luar Biasa untuk memahami ConnectManagement dalam .NET

Semoga ini bisa menyelesaikan masalah Anda!

EDIT: Ups, saya melihat Anda memiliki manajemen koneksi yang disebutkan dalam kode Anda di atas. Saya akan meninggalkan info saya di atas karena relevan untuk enquirers masa depan dengan masalah yang sama. Namun, harap diperhatikan saat ini terdapat 4 file machine.config yang berbeda di sebagian besar server terkini!

Ada .NET Framework v2 berjalan di bawah 32-bit dan 64-bit serta .NET Framework v4 juga berjalan di bawah 32-bit dan 64-bit. Tergantung pada pengaturan yang Anda pilih untuk kumpulan aplikasi Anda, Anda bisa menggunakan salah satu dari 4 file machine.config yang berbeda ini! Silakan periksa semua 4 file machine.config yang biasanya terdapat di sini:

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config
  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config
98
BenSwayne

Saya menyadari pertanyaannya mungkin agak lama, tetapi Anda mengatakan backend berjalan di server yang sama. Itu berarti pada port yang berbeda, mungkin selain port default 80.

Saya pernah membaca bahwa ketika Anda menggunakan elemen konfigurasi "connectionManagement", Anda perlu menentukan nomor port jika berbeda dari default 80.

LINK: pengaturan maxConnection mungkin tidak berfungsi bahkan autoConfig = false di ASP.NET

Kedua, jika Anda memilih untuk menggunakan konfigurasi default (address = "*") diperluas dengan nilai spesifik backend Anda sendiri, Anda dapat mempertimbangkan untuk menempatkan nilai spesifik terlebih dahulu! Jika tidak, jika ada permintaan, * cocok terlebih dahulu dan 2 koneksi default diambil. Sama seperti ketika Anda menggunakan bagian di web.config.

LINK: <remove> Elemen untuk koneksiManajemen (Pengaturan Jaringan)

Semoga ini bisa membantu seseorang.

7
Sebastian Hek

Mungkinkah Anda menggunakan referensi layanan web berbasis WCF? Secara default, ServiceThrottlingBehavior.MaxConcurrentCalls adalah 16.

Anda dapat mencoba memperbarui elemen <serviceThrottling> perilaku referensi layanan Anda

<serviceThrottling
    maxConcurrentCalls="999" 
    maxConcurrentSessions="999" 
    maxConcurrentInstances="999" />

(Perhatikan bahwa saya akan merekomendasikan pengaturan di atas.) Lihat MSDN untuk informasi lebih lanjut bagaimana mengkonfigurasi elemen <behavior> yang sesuai.

5
Ruben

Sudahkah Anda mencoba mengatur nilai properti statis DefaultConnectionLimit secara terprogram?

Berikut ini adalah sumber informasi yang bagus tentang sakit kepala yang sebenarnya itu ... ASP.NET Thread Usage on IIS 7.5, IIS 7.0, dan IIS 6. , dengan pembaruan untuk kerangka 4.0.

3
Simon Mourier

Lihat bagian "Threading" dari halaman ini: http://msdn.Microsoft.com/en-us/library/ff647786.aspx , dalam hubungannya dengan bagian "Koneksi".

Sudahkah Anda mencoba meningkatkan atribut maxconnection dari pengaturan processModel Anda?

2
Matthew Evans

saat melakukan pengujian kinerja, ukuran yang saya gunakan adalah RPS, yaitu berapa banyak permintaan per detik yang dapat dilayani server dalam latensi yang dapat diterima.

secara teoritis satu server hanya dapat menjalankan sebanyak permintaan bersamaan dengan jumlah core di dalamnya.

Kelihatannya masalahnya bukan pada model threading ASP.net, karena berpotensi melayani ribuan rps. Sepertinya masalahnya mungkin aplikasi Anda. Apakah Anda menggunakan primitif sinkronisasi?

juga apa latensi pada layanan web Anda, apakah mereka sangat cepat merespon (dalam mikrodetik), jika tidak maka Anda mungkin ingin mempertimbangkan panggilan tidak sinkron, sehingga Anda tidak akhirnya memblokir

Jika ini tidak membuat sesuatu, maka Anda mungkin ingin membuat profil kode Anda menggunakan visual studio atau redgate profiler

0
np-hard

Jika tidak didefinisikan dalam layanan web atau aplikasi atau server (Apache atau IIS) yang hosting layanan web habis maka Anda dapat membuat koneksi tak terbatas hingga kegagalan

0
Frank Tudor