4

BasicHttpBindingによって消費された WCF サービスを自己ホストしましたASMX Client1200 ユーザーの同時ユーザー負荷をシミュレートしています。サービス メソッドは文字列パラメーターを受け取り、文字列を返します。交換されるデータは 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 の不一致と大規模なデータ交換でよく報告されます。しかし、負荷テストを行うときは決してありません。私は十分に閲覧し、以下を含むほとんどのオプションを試しました。

  1. サーバー側でトレースとメッセージのログを有効にしました。しかし、エラーは記録されませんでした。
  2. ポートの枯渇を克服するために、MaxUserPort は 65535 に設定され、TcpTimedWaitDelay は 30 秒に設定されます。
  3. MaxConcurrent Calls は 600 に設定され、MaxConcurrentInstances は 1200 に設定されます。
  4. 開く、閉じる、送信、および受信のタイムアウトは 10 分に設定されています。
  5. HTTPWebRequest KeepAlive が false に設定されています。

過去 2 日間、問題を突き止めることができませんでした。

どんな助けでも大歓迎です。

ありがとうございました。

4

2 に答える 2

0

サービス側のWCFログにエラーがない場合は、HTTP.SYSドライバーレイヤーで何らかの制限に達しており、サービスアプリケーションが要求を認識する前に要求が拒否されている可能性があります。特定のアプリケーションのリクエストキューのデフォルトの制限は1000かもしれないと思います。

私はHTTP.SYSの専門家ではありませんが、次のコマンドを実行することで洞察を得ることができます。

netsh http show servicestate
于 2010-12-23T15:52:42.407 に答える
0

CPUとRAMに応じて、さまざまなサーバーで同様の問題が発生しました。サーバーの種類、アップグレード方法 (XP Pro または Server 2003 から Server 2008 にアップグレード) などについては言及されていませんでした。私が問題を解決した方法は、x:\Windows\Microsoft.NET\Framework[バージョン] を確認することでした。 \config\machine.config. どうやら IIS を介して「無制限」の接続を選択しても、「無制限」の接続を意味するわけではありません。私が遭遇した接続の数は、まったく同じミリ秒で 11 のリクエストの後にエラーになりました。

この問題は、同じソースからの接続数に関連していました。パフォーマンス ベンチマーク ツールは、同じ IP を持つ同じ PC に常駐していました。machine.config には、同じソースからの接続数に関する制約が含まれています。

于 2011-01-21T04:44:02.310 に答える