मेरे ASP.NET अनुप्रयोग के साथ-साथ # कनेक्शन को सीमित करने वाली वेब सेवा क्या कर सकती है?


90

मेरे पास ASP.NET 4.0 अनुप्रयोग चल रहा है जो कि IIS 7.5 पर 64-बिट विंडोज सर्वर 2008 R2 एंटरप्राइज मशीन पर RAM, CPU, डिस्क, आदि के साथ चल रहा है।

प्रत्येक वेब अनुरोध के साथ, ASP.NET एप्लिकेशन बैकएंड वेब सेवा (कच्चे सॉकेट के माध्यम से) के लिए एक कनेक्शन बनाता है, जो एक ही मशीन पर चल रहा है।

समस्या: बैकएंड वेब सेवा के साथ-साथ कनेक्शन के # को सीमित करने के लिए कुछ प्रतीत होता है। संदेहास्पद रूप से, समवर्ती कनेक्शनों की संख्या 16 में सबसे ऊपर है।

मुझे यह समझ में आया कि Microsoft का यह महत्वपूर्ण लेख एएसपी.नेट ऐप्स को जोड़ने के लिए IIS की सेटिंग्स को समझने के लिए समझाता है जो बहुत सारे वेब सेवा अनुरोध करते हैं: http://support.microsoft.com/?id=821268#tocHeadRef

मैंने लेख की अनुशंसा का पालन किया, लेकिन फिर भी कोई भाग्य नहीं। सेटिंग जो विशेष रूप से दिलचस्प है वह maxconnectionसेटिंग है, जिसे मैंने 999 पर भी टक्कर दी।

किसी भी विचार और क्या कनेक्शन गला घोंटना हो सकता है?

नोट: जब मैं मिक्स से आईआईएस काटता हूं और क्लाइंट्स सीधे बैकएंड वेब सेवा से जुड़ते हैं, तो यह खुशी से उतने कनेक्शन खोलेगा जितने की मुझे जरूरत है, इसलिए मैं सकारात्मक हूं कि बैकेंड टोंटी नहीं है। यह IIS / ASP.NET- भूमि में कुछ होना चाहिए।

यहाँ प्रासंगिक अनुभाग है machine.configजिसके बारे में मुझे यकीन है कि आवेदन द्वारा पढ़ा जा रहा है (इसके साथ सत्यापित 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>

@DanB का यहां एक अच्छा बिंदु है - आप समवर्ती कनेक्शन की संख्या को कैसे माप रहे हैं?
जेरेमी मैक्गी

@JeremyMcGee मैं IIS कार्यकर्ता प्रक्रियाओं द्वारा कितने बैकएंड कनेक्शन बनाए गए हैं, यह देखने के लिए सर्वर पर TCPView चलाकर # समवर्ती कनेक्शन का मापन कर रहा हूं।
रॉब सोबर्स

क्या वेब ग्राहक स्वतंत्र मशीनों या उसी मशीन पर चल रहे हैं? (यह देखते हुए कि कोई क्लाइंट-साइड थ्रॉटलिंग नहीं हो रहा है।)
जेरेमी मैक्गी

3
@JeremyMcGee अलग मशीनें। प्रति मशीन 1 क्लाइंट-सर्वर कनेक्शन। इसके अलावा, हम जानते हैं कि नेटवर्क पर कहीं भी कोई थ्रॉटलिंग नहीं है क्योंकि जब हम बैकएंड को सीधे हिट करते हैं (जो HTTP पर भी होता है) तो हम अड़चन में नहीं दौड़ते।
रोब सोबर्स

1
रोब, क्या आपने कभी इसका कोई निश्चित समाधान खोजा?
इलेक्ट्रॉनिककेटी

जवाबों:


104

यहां प्रदान किए गए अधिकांश उत्तर आपके बैकएंड वेब सेवा के लिए आने वाले अनुरोधों की संख्या को संबोधित करते हैं , न कि आउटगोइंग अनुरोधों की संख्या जो आप अपने ASP.net एप्लिकेशन से अपनी बैकेंड सेवा में कर सकते हैं।

यह आपका बैकएंड वेबसेवा नहीं है जो आपके अनुरोध दर को यहां थ्रॉटलिंग कर रहा है, यह एक खुले कनेक्शन की संख्या है जो आपके कॉलिंग एप्लिकेशन को उसी एंडपॉइंट (उसी URL) पर स्थापित करने के लिए तैयार है।

आप निम्न विन्यास अनुभाग को अपनी मशीन में जोड़कर इस सीमा को हटा सकते हैं। फाइल फाइल:

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

यदि आप 50 या 100 समवर्ती कनेक्शन चाहते हैं, तो आप निश्चित रूप से अधिक उचित संख्या चुन सकते हैं। लेकिन ऊपर यह सही अधिकतम करने के लिए खुल जाएगा। आप '*' के बजाय ऊपर की खुली सीमा के नियम के लिए एक विशिष्ट पता भी निर्दिष्ट कर सकते हैं जो सभी पतों को इंगित करता है।

MSDN System.Net.connectionManagement के लिए प्रलेखन

.NET में ConnectManagement समझने के लिए एक और महान संसाधन

आशा है इससे तुम्हारी समस्या का समाधान हो गया होगा!

संपादित करें: उफ़, मुझे लगता है कि आपके पास अपने कोड में उल्लिखित कनेक्शन प्रबंधन है। मैं अपनी उपरोक्त जानकारी को छोड़ दूंगा क्योंकि यह भविष्य के enquirers के लिए समान समस्या के साथ प्रासंगिक है। हालाँकि, कृपया ध्यान दें कि वर्तमान में अधिकतम सर्वरों पर 4 विभिन्न मशीन हैं।

.NET फ्रेमवर्क V2 32-बिट और 64-बिट दोनों के साथ-साथ चल रहा है। .NET फ्रेमवर्क V4 भी 32-बिट और 64-बिट दोनों के तहत चल रहा है। आपके आवेदन पूल के लिए आपकी चुनी हुई सेटिंग्स के आधार पर आप इन 4 अलग मशीनों में से किसी एक का उपयोग कर सकते हैं। फाइल फाइल्स! आमतौर पर यहां स्थित सभी 4 machine.config फाइलें जांचें:

  • C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Config
  • C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ Config
  • C: \ Windows \ Microsoft.NET \ फ्रेमवर्क \ v4.0.30319 \ Config
  • C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config

हाँ, मैंने उस आधार को कवर किया। वैसे भी धन्यवाद, @BenSwayne! मैंने सत्यापित किया कि मैंने सही machine.config(64-बिट 4.0) को संशोधित किया है ।
रोब सोबर्स

@RobSobers: इस मामले में मुझे कार्यान्वयन कोड पर थोड़ा संदेह होगा। शायद आप धागे या कुछ और से बाहर चल रहे हैं? क्या आप अपने TcpClient webservice कॉल कोड को कंसोल ऐप में फेंक सकते हैं और देख सकते हैं कि क्या आप बेहतर अनुरोध दर प्राप्त कर सकते हैं? यह साबित करेगा कि इसका IIS विशिष्ट कॉन्फ़िगरेशन या व्यापक .NET कॉन्फ़िगरेशन या आपका कोड है।
बेन्सवे

क्या यह लाइन क्लाइंट मशीन में जाती है?
उरी अब्रामसन

धन्यवाद, अपनी सेटिंग्स processModel twekaing के साथ गठबंधन से codeproject.com/Articles/133738/... "निर्धारित ISAPI 'सी: \ windows \ Microsoft.Net \ फ्रेमवर्क \ v2.0.050727 \ aspnet_isapi.dll' ही निम्न कारण अस्वस्थ रूप में रिपोर्ट : 'डेडलॉक का पता चला "समस्या
ज़ाकोस

@BenSwayne SMTP कनेक्शन के लिए भी यही अवधारणा लागू करता है? मैं तो एक थोक ईमेल भेजने के आवेदन को डिजाइन कर रहा हूँ इस जाएगा ConnectionManagement संपत्ति थोक मेल के रूप में अच्छी तरह से भेजने में उपयोगी हो सकता है (के लिए बहु सूत्रण का उपयोग कर mail.send समारोह)?
vibs2006

7

मुझे लगता है कि प्रश्न पुराना हो सकता है, लेकिन आप कहते हैं कि बैकएंड उसी सर्वर पर चल रहा है। इसका मतलब है कि एक अलग पोर्ट पर, शायद डिफ़ॉल्ट पोर्ट 80 के अलावा।

मैंने पढ़ा है कि जब आप "कनेक्शन प्रबंधक" कॉन्फ़िगरेशन तत्व का उपयोग करते हैं, तो आपको पोर्ट संख्या निर्दिष्ट करने की आवश्यकता होती है यदि यह डिफ़ॉल्ट 80 से भिन्न होता है।

लिंक: maxConnection सेटिंग ASP.NET में भी autoConfig = false काम नहीं कर सकती है

दूसरे, यदि आप अपने स्वयं के बैकएंड विशिष्ट मूल्य के साथ डिफ़ॉल्ट कॉन्फ़िगरेशन (पता = "*") का उपयोग करना चुनते हैं, तो आप पहले विशिष्ट मूल्य डालने पर विचार कर सकते हैं! अन्यथा, यदि कोई अनुरोध किया जाता है, तो * पहले मेल खाता है और 2 कनेक्शन का डिफ़ॉल्ट लिया जाता है। जैसे आप web.config में सेक्शन का उपयोग करते हैं।

लिंक: <निकालें> कनेक्शन प्रबंधन के लिए तत्व (नेटवर्क सेटिंग्स)

आशा है कि यह किसी की मदद करता है।


5

क्या यह संभव है कि आप WCF- आधारित वेब सेवा संदर्भ का उपयोग कर रहे हों? डिफ़ॉल्ट रूप से, ServiceThrottlingBehavior.MaxConcurrentCalls 16 है।

आप अपने सेवा संदर्भ व्यवहार के <serviceThrottling>तत्व को अपडेट करने का प्रयास कर सकते हैं

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

(ध्यान दें कि मैं ऊपर दी गई सेटिंग्स की सिफारिश करूंगा।) एक उपयुक्त तत्व को कॉन्फ़िगर करने के तरीके के बारे में अधिक जानकारी के लिए MSDN देखें <behavior>


काश हम होते, लेकिन हम नहीं। उपभोग की जा रही सेवा अपाचे / पायथन / mod_wsgi में एक और मशीन पर चल रही है, और, जैसा कि रोब ने उल्लेख किया है, यह स्पष्ट रूप से मुद्दा नहीं है।
बेंजामिन पोलाक

ग्राहक पर सेवा संदर्भ हैं। अपाचे सेवा का उपभोग करने वाला आपका ग्राहक कैसा है?
जॉन सॉन्डर्स

जैसे जॉन ने कहा: थ्रॉटलिंग वेब सेवा का उपभोग करने वाले क्लाइंट पर सेट है। शायद वाक्यांश "आपकी सेवा व्यवहार" थोड़ा भ्रामक है। क्या यह अधिक समझ में आता है जब "आपकी सेवा संदर्भ व्यवहार" के रूप में प्रकाशित किया जाता है?
रुबेन

@ जॉन ने इसका सेवन किया है TcpClient(सेवा कस्टम बाइनरी ब्लब्स को जोड़ती है , डब्ल्यूसीएफ / एसओएपी या समान नहीं)। उन कॉन्फ़िगरेशन विकल्प प्रतीत विशुद्ध रूप से आप को प्रभावित किया जा सकता है अगर आप का उपयोग करें ServiceHost, नहीं TcpClient; क्या मैं कुछ भूल रहा हूँ?
बेंजामिन पोलाक

क्यों नहीं "सेवा संदर्भ जोड़ें" का उपयोग करें?
जॉन सॉन्डर्स

3

क्या आपने प्रोग्रामिक रूप से स्थिर DefaultConnectionLimit संपत्ति का मान सेट करने का प्रयास किया है ?

यहाँ उस सच्चे सिरदर्द के बारे में जानकारी का एक अच्छा स्रोत है ... चौखट 4.0 के अपडेट के साथ IIS 7.5, IIS 7.0 और IIS 6.0 पर ASP.NET थ्रेड उपयोग


मुझे लगता है कि यह मायने नहीं रखना चाहिए, लेकिन मैं इसे वैसे भी आजमाने जा रहा हूं।
रोब सोबर्स

इस तरह हमने इसे कुछ साल पहले तय किया। हमारे पास समसामयिक मुद्दे थे और यह इसे स्पष्ट करने के लिए लग रहा था। Net.ServicePointManager.DefaultConnectionLimit = 1000 जो हमने उपयोग किया है। कनेक्शन वर्ग बनाने से पहले आपको इसे सेट करना होगा।
ब्रेन २००

2

इस पृष्ठ का "थ्रेडिंग" खंड देखें: http://msdn.microsoft.com/en-us/library/ff647786.aspx , "कनेक्शन्स" खंड के संयोजन में।

क्या आपने अपने processModel सेटिंग की अधिकतम सीमा विशेषता को ऊपर उठाने की कोशिश की है?


हाँ मेरे पास है। लेकिन उस लेख को आपने कुछ दिलचस्प बताया है, maxconnectionजिसका उल्लेख करने के लिए उपेक्षित विषय पर कभी भी अन्य लेख: यह विशेषता स्थानीय वेब सेवा कॉल पर लागू नहीं होती है । इस विशेष मामले में वेब सेवा है स्थानीय, लेकिन हम एक और वातावरण में है कि एक ही समस्या है, जहां सेवा स्थानीय नहीं है।
रॉब सोबर्स

@RobSobers - मुझे लगता है कि उपरोक्त लिंक एक दूसरे लुक के योग्य है। भाग के बारे में जांचें minLocalRequestFreeThreads- यह कार्यकर्ता प्रक्रिया स्थानीयहोस्ट (जहां एक वेब एप्लिकेशन को उसी सर्वर पर वेब सेवा कहता है ) से अनुरोधों को पंक्तिबद्ध करने के लिए इस सेटिंग का उपयोग करता है यदि थ्रेड पूल में उपलब्ध थ्रेड्स की संख्या इस संख्या से नीचे आती है। यह सेटिंग minFreeThreads के समान है, लेकिन यह केवल उन अनुरोधों पर लागू होता है जो लोकलहोस्ट का उपयोग करते हैं
अहमद

@ अहद यूप, मैं भी सेट minLocalRequestFreeThreadsकरता हूं (मेरे machine.configसवाल में देखें ।
रॉब सोबर्स

0

यदि इसे वेब सेवा या एप्लिकेशन या सर्वर (एपाचे या IIS) में परिभाषित नहीं किया गया है जो वेब सेवा को होस्ट करने योग्य है तो आप विफलता तक अनंत कनेक्शन बना सकते हैं


0

प्रदर्शन परीक्षण करते समय, मेरे द्वारा जाने वाला माप आरपीएस है, अर्थात प्रति सेकंड कितने अनुरोध सर्वर स्वीकार्य विलंबता के भीतर सेवा कर सकते हैं।

सैद्धांतिक रूप से एक सर्वर केवल कई अनुरोधों के रूप में चला सकता है जैसे कि उस पर कोर की संख्या ।।

ऐसा नहीं लगता कि यह समस्या ASP.net के थ्रेडिंग मॉडल है, क्योंकि यह संभावित रूप से हजारों आरपीएस की सेवा दे सकता है। ऐसा लगता है कि समस्या आपके आवेदन की हो सकती है। क्या आप किसी भी तुल्यकालन आदिम का उपयोग कर रहे हैं?

आपकी वेब सेवाओं पर विलंबता क्या है, क्या वे (माइक्रोसेकंड के भीतर) प्रतिक्रिया करने के लिए बहुत जल्दी हैं, यदि नहीं, तो आप अतुल्यकालिक कॉल पर विचार करना चाह सकते हैं, इसलिए आप अवरुद्ध करना समाप्त नहीं करते हैं।

यदि यह कुछ नहीं करता है, तो आप विज़ुअल स्टूडियो या रेडगेट प्रोफाइलर का उपयोग करके अपने कोड को प्रोफाइल करना चाह सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.