2016-01-08 6 views
6

मुझे अपनी डब्ल्यूसीएफ सेवा में एक बहुत ही अजीब त्रुटि का सामना करना पड़ा है, जो कि नेटटेक बाइंडिंग का उपयोग करते समय किसी भी तरह सॉकेट स्तर में डेडलॉक या थ्रेड भुखमरी उत्पन्न करता है।net.tcp बाइंडिंग पर थ्रेड भुखमरी - टीसीपी त्रुटि कोड 10061

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (ServiceHost serviceHost = new ServiceHost(typeof(TestService))) 
     { 
      serviceHost.Open();    
      Console.WriteLine("Press <ENTER> to terminate service."); 
      Console.ReadLine(); 
      serviceHost.Close(); 
     } 
     Uri baseAddress = new Uri("net.tcp://localhost:8014/TestService.svc");   
    } 
} 

[ServiceContract] 
public interface ITestService 
{ 
    [OperationContract] 
    string GetData(string data); 
} 

public class TestService: ITestService 
{ 
    public string GetData(string data) 
    { 
     Console.WriteLine(data); 
     Thread.Sleep(5000); 
     return "Ok"; 
    } 
} 

विन्यास हिस्सा:

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="basicHttpBinding" closeTimeout="00:02:00" openTimeout="00:02:00" 
     receiveTimeout="00:02:00" sendTimeout="00:02:00" maxBufferSize="2000000000" 
     maxReceivedMessageSize="2000000000" /> 
    </basicHttpBinding> 
    <netTcpBinding> 
    <binding name="netTcpBinding" closeTimeout="00:02:00" openTimeout="00:02:00" 
     receiveTimeout="00:02:00" sendTimeout="00:02:00" listenBacklog="2000" 
     maxBufferSize="2000000000" maxConnections="1000" maxReceivedMessageSize="2000000000"> 
     <security mode="None"> 
     <transport protectionLevel="EncryptAndSign" /> 
     </security> 
    </binding> 
    <binding name="TestServiceTcpEndPoint"> 
     <security mode="None" /> 
    </binding> 
    </netTcpBinding>  
</bindings> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="CommonServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="1000" maxConcurrentInstances="1000" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service name="ServiceLauncher.TestService" behaviorConfiguration="CommonServiceBehavior"> 
    <endpoint address="" binding="netTcpBinding" bindingConfiguration="netTcpBinding" name="TestServiceTcpEndPoint" contract="ServiceLauncher.ITestService" /> 
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" name="TestServiceTcpEndPoint" contract="ServiceLauncher.ITestService" /> 
    <endpoint address="mex" binding="mexHttpBinding" bindingName="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:8014/TestService.svc"/> 
     <add baseAddress="http://localhost:1234/TestService.svc"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
</system.serviceModel> 

और मैं एक ग्राहक जो हर थ्रेड के लिए नया उदाहरण बनाने के साथ कई धागे में इस सेवा की खपत है (यह है कि मैं एक काफी सरल स्वयं के द्वारा होस्ट सेवा है एक आवश्यकता):

static void Main(string[] args) 
    {   
     for (int i = 0; i < 1000; i++) 
     { 
      Thread tr = new Thread(() => 
      { 
       using (var service = new Test.TestServiceClient()) 
       { 
        var result = service.GetData(i.ToString()); 
        Console.WriteLine(string.Format("{0}: {1} {2}", 
             DateTime.Now, 
             result, 
             Thread.CurrentThread.ManagedThreadId)); 
       } 
      }); 
      tr.Start();     
     } 
     Console.ReadLine();  
    } 

कुछ अनुरोध ग्राहक के बाद इस मामले में EndpointNotFoundException, टीसीपी त्रुटि कोड 10061, कोई कनेक्शन नहीं बनाया जा सकता है ख को जन्म देती है पारिस्थितिक लक्ष्य मशीन ने सक्रिय रूप से इनकार कर दिया। अनुरोधों की संख्या हर समय अलग होती है, और यह सर्वर भाग नहीं है क्योंकि यह अभी भी सामान्य स्थिति में काम करता है। और मुझे लगता है कि यह अनुरोधों को प्राप्त करता रहता है, इस स्थिति में सबसे अजीब बात क्या है। यह भी अजीब बात है कि यह आपके ग्राहक को अपवाद के बाद "अमर" होस्ट कर सकता है - ताकि सिस्टम के रीबूट को छोड़कर आप इसे किसी भी माध्यम से मार नहीं सकते। मुझे पूरा यकीन है कि समस्या क्लाइंट के कम सॉकेट स्तर में है, और यह किसी भी तरह की बड़ी संख्या में धागे से जुड़ा हुआ है, लेकिन मैं ऐसी समस्या को खोजने में सफल नहीं हुआ जो समस्या को समझ सके।

+0

आप [WPF प्रदर्शन काउंटरों सक्षम] अगर (https://msdn.microsoft.com/en-us/library/ms735098.aspx) देखें "मैक्स समवर्ती कॉल का प्रतिशत", "मैक्स समवर्ती उदाहरणों का प्रतिशत" और "अधिकतम समवर्ती सत्रों का प्रतिशत" क्या है। (http://blogs.msdn.com/b/appfabriccat/archive/2010/10/29/less-tweaking-of-your-wcf-4-0-apps-for-high-throughput-workloads.aspx के लिए देखें अधिक जानकारी।) –

+0

@ScottChamberlain टिप के लिए धन्यवाद, लेकिन मुझे संदेह है कि यह मुझे सेवा क्लाइंट के बारे में कुछ उपयोगी जानकारी देगा, क्योंकि यह वह जगह है जहां स्रोत त्रुटि और यह हिस्सा थ्रॉटल नहीं है। त्रुटि – Alex

+0

के बाद भी मूल प्रश्न गलत समझने के बाद भी सेवा ठीक से काम करती है और थ्रॉटल सही ढंग से काम करती है। मैंने सोचा कि लॉकअप सर्वर की तरफ था, फिर सुनिश्चित नहीं है। –

उत्तर

1

हर बार जब मैंने त्रुटि देखी है "कोई कनेक्शन नहीं बनाया जा सकता क्योंकि लक्ष्य मशीन ने सक्रिय रूप से इनकार कर दिया।" समस्या सेवा के साथ नहीं है। यह आमतौर पर सेवा तक पहुंचने में एक समस्या है।

एक जोड़े को सुझाव:

  1. Avoid using with WCF Proxies। आप several reasonable work arounds से चुन सकते हैं।

  2. WCF performance, latency and scalability पर मेरा उत्तर पढ़ें। धागे को पुराने तरीके से शुरू करने के अलावा, मूल रूप से एक ही परीक्षण ऐप। पोस्ट सभी क्लाइंट कारणों (मुझे मिल सकता है) का वर्णन करता है क्योंकि "कोई कनेक्शन नहीं बनाया जा सकता क्योंकि लक्ष्य मशीन ने सक्रिय रूप से इनकार कर दिया" और विभिन्न डब्ल्यूसीएफ, टीसीपी, और थ्रेड पूल सेटिंग्स प्रदान करता है जिन्हें समायोजित किया जा सकता है।

+1

युक्तियों के लिए धन्यवाद, लेकिन वास्तव में यह नहीं है कि मैं क्या देख रहा हूं। "उपयोग" का कारण सिर्फ वास्तविक प्रोजेक्ट में मेरी प्रॉक्सी में दूसरी आंशिक कक्षा का निपटान करना है, लेकिन मुझे संदेह है कि इस मुद्दे पर इसका असर पड़ा है। दूसरे भाग के लिए - मैंने थ्रॉटलिंग परिवर्तनों की कोशिश की, टीसीपी maxConnections और ListenBacklog गुण, सिस्टम रजिस्ट्री में tcpIp के पैरामीटर भी - कोई प्रभाव नहीं। मैं थ्रेड पूल का उपयोग नहीं कर सकता (यह अनुरोधों के बीच देरी बढ़ने और उनकी संख्या सीमित करने की वजह से समस्या हल करता है) क्योंकि मैं टीपीएल का उपयोग करता हूं और यह कुछ बिंदुओं पर डेडलॉक के साथ मुद्दों को ला सकता है। – Alex

0

आप विंडोज़ में समवर्ती टीसीपी/आईपी कनेक्शन पर आंतरिक सीमाओं को मार सकते हैं। इस लेख पर एक नज़र डालें और देखें कि यह मदद करता है:

http://smallvoid.com/article/winnt-tcpip-max-limit.html

+0

लिंक के लिए धन्यवाद, लेकिन मैंने पहले उन्हें आजमाया है (एर्नीएल उत्तर पर मेरी टिप्पणी देखें)। मैंने उन सभी को बदल दिया है, लेकिन उनमें से कोई भी इस मुद्दे को हल नहीं कर पाया है। यह वही है जो मैं वास्तव में देख रहा हूं - डब्ल्यूसीएफ, टीसीपी, सिस्टम रजिस्ट्री में सेटिंग, जो मुझे इस तरह के मल्टीथ्रेडिंग परिदृश्य में बाध्यकारी उपयोग करने की अनुमति देगी। – Alex

संबंधित मुद्दे