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を発生させますターゲットマシンは積極的にそれを拒否した。要求の数は常に異なり、通常の状態では依然として動作するため、サーバー部分ではありません。そして、私はそれが依頼を受け取り続けるのを見ます。何がこの状況で最も不思議です。あなたのクライアントホストを例外の後で "不滅"にすることができるのは奇妙なことです。システムのリブートを除いて、何らかの手段でそれを強制終了することはできません。私はかなり問題がクライアントのソケットレベルが低いことを確信しています、そして、何とかそのような多数のスレッドに接続されていますが、問題を説明できる何かを見つけることに成功しませんでした。
あなたは[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。) –
@ScottChamberlainはチップをありがとうが、これはソースクライアントのエラーとこの部分が抑制されていないので、これがサービスクライアントに関するいくつかの有用な情報を与えるのではないかと疑う。サービスは正常に動作し続け、エラー後も正しく調整されます – Alex
元の質問を誤解しました。私はロックアップがサーバ側にあったと思っていました。 –