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



1 Answers

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

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

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

Question

मैं 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 तक विंडोज सर्वर के साथ सफलतापूर्वक इसका परीक्षण किया।






Related