BasicHttpBindingによって消費された WCF サービスを自己ホストしましたASMX Client。1200 ユーザーの同時ユーザー負荷をシミュレートしています。サービス メソッドは文字列パラメーターを受け取り、文字列を返します。交換されるデータは 10KB 未満です。リクエストの処理時間は、Thread.Sleep(2000) ステートメントを使用することで 2 秒に固定されています。追加はありません。すべての DB ヒット / ビジネス ロジックを削除しました。
同じコードは、1000 人の同時ユーザーに対して正常に実行されます。数を 1200 ユーザーに増やすと、次のエラーが発生します。
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
--- End of inner exception stack trace ---
at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at WCF.Throttling.Client.Service.Function2(String param)
この例外は、DataContract の不一致と大規模なデータ交換でよく報告されます。しかし、負荷テストを行うときは決してありません。私は十分に閲覧し、以下を含むほとんどのオプションを試しました。
- サーバー側でトレースとメッセージのログを有効にしました。しかし、エラーは記録されませんでした。
- ポートの枯渇を克服するために、MaxUserPort は 65535 に設定され、TcpTimedWaitDelay は 30 秒に設定されます。
- MaxConcurrent Calls は 600 に設定され、MaxConcurrentInstances は 1200 に設定されます。
- 開く、閉じる、送信、および受信のタイムアウトは 10 分に設定されています。
- HTTPWebRequest KeepAlive が false に設定されています。
過去 2 日間、問題を突き止めることができませんでした。
どんな助けでも大歓迎です。
ありがとうございました。