IIS 6.0 でホストされている WCF サービス (.NET Framework 3.5 に組み込まれている) を使用しています。
コードの流れは以下の通り
- クライアント (別の Web サービス) が WCF サービスを呼び出す
- WCF サービスはスレッドを呼び出してバックグラウンドで処理を行い、呼び出し先にすぐに応答します。
- すべての処理が完了すると、バックグラウンド スレッドがスレッドをコールバックします。クライアントは Web サービスであるため、この呼び出しは基本的に HTTPS 要求です。
しきい値を定義するために、WCF サービスの負荷テストを行っています。観察は次のとおりです。
1 分以内に WCF サービスに対して行われた 1024 の要求の約 3 回の反復が正常に通過します。各反復を完了するのにかかる時間は、約 25 ~ 30 分です。ただし、4 回目のイテレーションからバルク エラーが見られます。リクエストの約 50% は、以下の例外で失敗します。
Exception-Thread が中止されました。
スタックトレース
21_10_2016_09_30_52,9:30:52 AM,Information,Thread name- apSwTTbLTETfwT3y Stack trace in ProcessTestConversion method - at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
at System.Net.LazyAsyncResult.WaitForCompletion(Boolean snap)
at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit)
at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
.
.(My function calls stack trace)
.
.
この問題を解決しようとした変更は次のとおりです。
<behavior>
<serviceThrottling maxConcurrentCalls="2000"
maxConcurrentInstances ="2400"
maxConcurrentSessions ="400"/>
</behavior>
web.config で
<system.web>
<compilation debug="false" />
<httpRuntime executionTimeout="1800"/>
</system.web>
web.config で
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "100" />
</connectionManagement>
</system.net>
web.config で
ServicePointManager.DefaultConnectionLimit = 100; (Change in code)
StackOverflow で多くの人が提案しているように、App プールの IdleTimeout プロパティを 0 に設定しました。
ストリームが使用される場所はどこでも、すべての場所で処分しました。したがって、すべてのストリームが閉じられます。
誰がスレッドを中止しているのか、その理由を教えてもらえますか?また、スレッド中止の開始の原因を追跡する手段やツールはありますか?