2016-01-08 34 views
6

NetTcpBindingを使用すると、ソケットレベルで何らかの原因でデッドロックやスレッド飢餓が発生するように見えるWCFサービスで非常に奇妙なエラーが発生しました。 (それはnet.tcpバインディングのスレッド飢餓 - TCPエラーコード10061

<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> 

そして、私はすべてのスレッドの新しいインスタンスを作成すると、多くのスレッドでこのサービスを消費クライアントを持っている:

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"; 
    } 
} 

の構成部分:私は非常に簡単セルフホスティングサービスを持っています要件):

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、TCPエラーコード10061、接続していませんBを発生させますターゲットマシンは積極的にそれを拒否した。要求の数は常に異なり、通常の状態では依然として動作するため、サーバー部分ではありません。そして、私はそれが依頼を受け取り続けるのを見ます。何がこの状況で最も不思議です。あなたのクライアントホストを例外の後で "不滅"にすることができるのは奇妙なことです。システムのリブートを除いて、何らかの手段でそれを強制終了することはできません。私はかなり問題がクライアントのソケットレベルが低いことを確信しています、そして、何とかそのような多数のスレッドに接続されていますが、問題を説明できる何かを見つけることに成功しませんでした。

+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 for more info。) –

+0

@ScottChamberlainはチップをありがとうが、これはソースクライアントのエラーとこの部分が抑制されていないので、これがサービスクライアントに関するいくつかの有用な情報を与えるのではないかと疑う。サービスは正常に動作し続け、エラー後も正しく調整されます – Alex

+0

元の質問を誤解しました。私はロックアップがサーバ側にあったと思っていました。 –

答えて

1

「ターゲットマシンが積極的にそれを拒否したため、接続できませんでした」というエラーが表示されるたびに表示されます。問題はサービスにはなかった。通常そのサービスに到達するには問題があります。

カップル提案:

  1. Avoid using with WCF Proxiesseveral reasonable work aroundsから選択できます。

  2. 私の答えはWCF performance, latency and scalabilityです。スレッドを開始する以外の古い方法、その基本的に同じテストアプリ。ポストには、「ターゲットマシンが積極的にそれを拒否したために接続できませんでした」原因となるさまざまなWCF、TCP、およびスレッドプールの設定を調整できるクライアントの原因がすべて記載されています。

+1

ヒントをありがとうが、実際に私が探しているものではありません。 "使用する"理由は、実際のプロジェクトで別の部分クラスを自分のプロキシに破棄することですが、それが問題に影響を与えるかどうかは疑問です。 2番目の部分に関して - 私は変更を抑制しようとしましたが、tcp maxConnectionsとListenBacklogプロパティ、システムレジストリ内のtcpIpのパラメータさえも効果がありませんでした。スレッドプールを使用することはできません(リクエスト間の遅延が増え、その数が制限されるため問題が解決されます)。なぜならTPLを使用していて、いくつかの点でデッドロックが発生する可能性があるからです。 – Alex

0

ウィンドウ内の同時TCP/IP接続の内部制限に遭う可能性があります。この記事を見ていると、それは場合に役立ちます参照してください。

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

+0

リンクをありがとう、しかし私はそれらを試してみました(私のErnieLの答えを見てください)。私はそれらをすべて変更しましたが、誰も問題を解決しませんでした。これは私が実際に探しているものです - WCF、TCP、System Registryの設定で、このようなマルチスレッドシナリオでバインディングを使用できるようになります。 – Alex

関連する問題