asp.net - नियमित सीएलआर धागे की तुलना में आईआईएस धागे इतने मूल्यवान क्यों हैं?




iis asynchronous (5)

असल में आपके द्वारा लिंक किए गए आलेख में जो लिखा गया है वह सत्य नहीं है। Async पैटर्न "सुपर महंगा आईआईएस वर्कर थ्रेड" मुक्त करने के लिए नहीं है और पृष्ठभूमि में कुछ अन्य "सस्ते धागे" का उपयोग करें।

Async पैटर्न बस धागे मुक्त करने के लिए है। आप उन परिदृश्यों में इसका लाभ उठा सकते हैं जहां आपको अपने धागे की आवश्यकता नहीं है (और यहां तक ​​कि आपकी स्थानीय मशीन भी नहीं)।

मैं दो उदाहरण परिदृश्यों (दोनों I / O) का नाम दे सकता हूं:

प्रथम:

  1. BeginRequest
  2. Async फ़ाइल को पढ़ना शुरू करें
  3. फ़ाइल पढ़ने के दौरान आपको अपने धागे की आवश्यकता नहीं है - इसलिए अन्य अनुरोध इसका उपयोग कर सकते हैं।
  4. फ़ाइल पढ़ी जाती है - आपको ऐप पूल से थ्रेड मिलता है।
  5. अनुरोध खत्म होता है।

और लगभग समान दूसरा:

  1. BeginRequest
  2. डब्ल्यूसीएफ सेवा के लिए एसिंक कॉल शुरू करें।
  3. हम अपनी मशीन छोड़ सकते हैं और हमारे थ्रेड की आवश्यकता नहीं है - इसलिए अन्य अनुरोध इसका उपयोग कर सकते हैं।
  4. हमें दूरस्थ सेवा से प्रतिक्रिया मिलती है - हमें ऐप पूल से जारी रखने के लिए कुछ धागा मिलता है।
  5. अनुरोध खत्म होता है।

एमएसडीएन पढ़ने के लिए आमतौर पर सुरक्षित है। आप here एसिंक पैटर्न के बारे में जानकारी प्राप्त कर सकते here

मैं ASP.NET एमवीसी में AsyncControllers के बारे में पढ़ रहा हूँ।

ऐसा लगता है कि उनके अस्तित्व का एकमात्र कारण यह है कि आईआईएस धागे को बचाया जा सकता है जबकि लंबे समय तक चलने वाले काम को नियमित सीएलआर धागे में सौंप दिया जाता है, जो कि सस्ता प्रतीत होता है।

मेरे यहां कुछ प्रश्न हैं:

  • इन आईआईएस धागे इतनी महंगी क्यों हैं कि इस पूरे आर्किटेक्चर को एसिंक्रोनस नियंत्रकों का समर्थन करने के लिए बनाया गया है?
  • मैं अपने आईआईएस एप्लिकेशन पूल में कितने आईआईएस थ्रेड चल रहा हूं, मैं कैसे जानता / कॉन्फ़िगर कर सकता हूं?

हमारी वेबसाइट सेवा को समय-समय पर 100 आवश्यकता / सेकेंड की सेवा करने की आवश्यकता होती है जबकि शेष समय 1 अनुरोध / दूसरा होता है। एनाज़िंज आईआईएस लॉग हमने पाया कि इस तरह की कॉल करने के लिए विस्फोट होने पर 28 के आसपास लगते हैं।

@nunespascal द्वारा उद्धृत माइक्रोसॉफ्ट सर्वोत्तम प्रथाओं को लागू करने से हमारे मामले में समय कम हो गया है

नीचे एक पावरहेल स्क्रिप्ट है जिसे हम वर्तमान में उपयोग करते हैं जब हम अपने उत्पादन सर्वर को तैनात करते हैं। यह logical प्रोसेसर संख्या की गिनती machine.config अद्यतन करता है।

<# Get and backup current machine.config #>
$path = "C:\Windows\Microsoft.Net\Framework\v4.0.30319\Config\machine.config";
$xml = [xml] (get-content($path));
$xml.Save($path + "-" + (Get-Date -Format "yyyyMMdd-HHmm" ) + ".bak");

<# Get number of physical CPU #>
$physicalCPUs = ([ARRAY](Get-WmiObject Win32_Processor)).Count;

<# Get number of logical processors #>
$logicalProcessors = (([ARRAY](Get-WmiObject Win32_Processor))[0] | Select-Object “numberOfLogicalProcessors").numberOfLogicalProcessors * $physicalCPUs;

<# Set Number of connection in system.net/connectionManagement #>
$systemNet =  $xml.configuration["system.net"];
if (-not $systemNet){
    $systemNet = $xml.configuration.AppendChild($xml.CreateElement("system.net"));
}

$connectionManagement = $systemNet.connectionManagement;
if (-not $connectionManagement){

    $connectionManagement = $systemNet.AppendChild($xml.CreateElement("connectionManagement"));
}

$add = $connectionManagement.add;
if(-not $add){
    $add = $connectionManagement.AppendChild($xml.CreateElement("add")) ;
}
$add.SetAttribute("address","*");
$add.SetAttribute("maxconnection", [string]($logicalProcessors * 12) );

<# Set several thread settings in system.web/processModel #>
$systemWeb =  $xml.configuration["system.web"];
if (-not $systemWeb){
    $systemWeb = $xml.configuration.AppendChild($xml.CreateElement("system.web"));
}

$processModel = $systemWeb.processModel;
if (-not $processModel){
    $processModel = $systemWeb.AppendChild($xml.CreateElement("processModel"));
}
$processModel.SetAttribute("autoConfig","true");
$processModel.SetAttribute("maxWorkerThreads","100");
$processModel.SetAttribute("maxIoThreads","100");
$processModel.SetAttribute("minWorkerThreads","50");
$processModel.SetAttribute("minIoThreads","50");

<# Set other thread settings in system.web/httRuntime #>
$httpRuntime = $systemWeb.httpRuntime;
if(-not $httpRuntime){
    $httpRuntime = $systemWeb.AppendChild($xml.CreateElement("httpRuntime"));
}
$httpRuntime.SetAttribute("minFreeThreads",[string]($logicalProcessors * 88));
$httpRuntime.SetAttribute("minLocalRequestFreeThreads",[string]($logicalProcessors * 76));

<#Save modified machine.config#>
$xml.Save($path);

यह समाधान 200 9 में स्टुअर्ट बियरले द्वारा लिखे गए ब्लॉग आलेख से हमारे पास आया था। हमने 2008 आर 2 से 2016 तक विंडोज सर्वर के साथ सफलतापूर्वक इसका परीक्षण किया।


ASP.NET प्रक्रिया .NET थ्रेड पूल से थ्रेड का उपयोग करके अनुरोध करती है। थ्रेड पूल थ्रेड के पूल को बनाए रखता है जो थ्रेड प्रारंभिक लागतों को पहले ही कर चुका है। इसलिए, इन धागे का पुन: उपयोग करना आसान है। .NET थ्रेड पूल भी स्वयं-ट्यूनिंग है। यह सीपीयू और अन्य संसाधन उपयोग पर नज़र रखता है, और यह आवश्यकतानुसार थ्रेड पूल आकार को नए धागे जोड़ता है या ट्रिम करता है। आपको आम तौर पर काम करने के लिए मैन्युअल रूप से धागे बनाने से बचना चाहिए। इसके बजाय, थ्रेड पूल से धागे का उपयोग करें। साथ ही, यह सुनिश्चित करना महत्वपूर्ण है कि आपका एप्लिकेशन लंबे अवरोधन संचालन नहीं करता है जो जल्दी से थ्रेड पूल भुखमरी का कारण बन सकता है और HTTP अनुरोधों को खारिज कर सकता है।

डिस्क I / O, वेब सेवा कॉल, सभी अवरुद्ध कर रहे हैं। एसिंक कॉल का उपयोग करके सबसे अच्छा अनुकूलित किया गया है। जब आप एसिंक कॉल करते हैं, तो एएसपीनेट आपके धागे को मुक्त करता है और कॉलबैक फ़ंक्शन लागू होने पर अनुरोध को अन्य थ्रेड पर असाइन किया जाएगा।

थ्रेड की संख्या को कॉन्फ़िगर करने के लिए आप सेट कर सकते हैं:

<system.web>
    <applicationPool maxConcurrentRequestsPerCPU="50" maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000"/>
</system.web>

संदर्भ: आईआईएस 7.5, आईआईएस 7.0, और आईआईएस 6.0 पर एएसपी.नेट थ्रेड उपयोग

ये सेटिंग हैं जो माइक्रोसॉफ्ट के सर्वोत्तम प्रथाओं की सिफारिश करते हैं :

  • सीपीयू के 12 * # तक अधिकतम कनेक्शन सेट करें । यह सेटिंग आउटगोइंग HTTP कनेक्शन की अधिकतम संख्या को नियंत्रित करती है जिसे आप क्लाइंट से शुरू कर सकते हैं। इस मामले में, एएसपी.नेट ग्राहक है। सीपीयू के 12 * # तक अधिकतम कनेक्शन सेट करें।
  • अधिकतम IoThreads 100 पर सेट करें । यह सेटिंग .NET थ्रेड पूल में अधिकतम I / O धागे को नियंत्रित करती है। यह संख्या स्वचालित रूप से उपलब्ध CPUs की संख्या से गुणा हो जाती है। MaxloThreads को 100 पर सेट करें।
  • MaxWorkerThreads को 100 पर सेट करें । यह सेटिंग थ्रेड पूल में अधिकतम कार्यकर्ता थ्रेड को नियंत्रित करती है। यह संख्या तब उपलब्ध CPUs की संख्या से स्वचालित रूप से गुणा हो जाती है। MaxWorkerThreads को 100 पर सेट करें।
  • सीपीयू के 88 * # तक minFreeThreads सेट करें । इस सेटिंग का उपयोग कार्यकर्ता प्रक्रिया द्वारा सभी आने वाले अनुरोधों को कतार में करने के लिए किया जाता है यदि थ्रेड पूल में उपलब्ध थ्रेड की संख्या इस सेटिंग के मान के नीचे आती है। यह सेटिंग प्रभावी रूप से उन अनुरोधों की संख्या को सीमित करती है जो maxWorkerThreads - minFreeThreads के साथ एक साथ चल सकते हैं। सीपीयू के 88 * # तक minFreeThreads सेट करें। यह समवर्ती अनुरोधों की संख्या 12 तक सीमित करता है (मानते हैं कि अधिकतम वर्कर थ्रेड 100 है)।
  • सीपीयू के 76 * # तक minLocalRequestFreeThreads सेट करें । थ्रेड पूल में उपलब्ध धागे की संख्या इस संख्या से नीचे गिरने पर स्थानीय सेटिंग से अनुरोधों को कतारबद्ध करने के लिए कार्यकर्ता प्रक्रिया द्वारा इस सेटिंग का उपयोग किया जाता है (जहां एक वेब एप्लिकेशन स्थानीय वेब सेवा के लिए अनुरोध भेजता है)। यह सेटिंग minFreeThreads के समान है लेकिन यह केवल स्थानीय कंप्यूटर से स्थानीयहोस्ट अनुरोधों पर लागू होती है। सीपीयू के 76 * # तक minLocalRequestFreeThreads सेट करें।

नोट : इस खंड में प्रदान की गई सिफारिशें नियम नहीं हैं। वे एक शुरुआती बिंदु हैं।

आपके आवेदन के लिए सबसे अच्छा काम करने के लिए आपको अपने एप्लिकेशन को बेंचमार्क करना होगा।


आईआईएस धागे को डिफ़ॉल्ट थ्रेड पूल से लिया जाता है, जो प्रोसेसर कोर की संख्या के आधार पर डिफ़ॉल्ट रूप से सीमित होता है। यदि यह थ्रेड पूल कतार का बैक अप लिया जाता है, तो आईआईएस अनुरोधों का जवाब देना बंद कर देगा। एसिंक कोड का उपयोग करके, एसिंक ऑपरेशन होने पर थ्रेड पूल थ्रेड को पूल में वापस किया जा सकता है, जिससे आईआईएस समग्र रूप से अधिक अनुरोधों की सेवा कर सकता है।

दूसरी ओर, अपने आप पर एक नया धागा फैलाने से थ्रेड पूल थ्रेड का उपयोग नहीं होता है। स्वतंत्र धागे की एक अनियंत्रित संख्या को उत्पन्न करना भी एक समस्या हो सकती है, इसलिए यह आईआईएस थ्रेड पूल मुद्दे के लिए ठीक नहीं है। Async IO आमतौर पर किसी भी तरह से पसंद किया जाता है।

थ्रेड पूल में धागे की संख्या बदलने के लिए, यहां जांचें । हालांकि, आपको शायद ऐसा करने से बचाना चाहिए।


आप एक समर्थित तरीके से 4.0 अनुप्रयोगों को विकसित करने के लिए विजुअल स्टूडियो 2008 का उपयोग नहीं कर सकते हैं। वर्तमान में केवल विजुअल स्टूडियो 2010 का उपयोग 4.0 ऐप्स विकसित करने के लिए किया जा सकता है। 2008 से शुरू करने से आप इसे ढांचे के पुराने संस्करणों के विकास के लिए उपयोग कर सकते हैं लेकिन बाद में नहीं।





asp.net .net iis asynchronous