2016-10-21 6 views
17

IIS 6.0でホストされているWCFサービス(.NET Framework 3.5に組み込まれています)があります。wcfサービスでスレッドが異常終了する例外

  1. を次のように

    コードの流れがある(別のWebサービスである)クライアントは、バックグラウンドで処理を行うためのスレッドを起動し、すぐに呼び出し先に応答WCFサービスに

  2. WCFサービスを呼び出します。
  3. すべての処理を完了したバックグラウンドスレッドは、スレッドをコールバックします。この呼び出しは、クライアントがWebサービスであるため、基本的にHTTPs要求です。

WCFサービスをロードテストして、しきい値を定義しています。以下のような結果が得られます。

1分以内にWCFサービスに対して約1024回繰り返されます。各反復を完了するのにかかる時間は約25〜30分です。 しかし、4回目の反復ではバルク障害が発生します。要求の約50%は以下の例外を除いて失敗します。

例外スレッドが中止されました。

スタックトレース

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

私はこの問題を解決しようとした変更内容は次の通りです:web.configファイルで

<behavior> 
    <serviceThrottling maxConcurrentCalls="2000" 
           maxConcurrentInstances ="2400" 
           maxConcurrentSessions ="400"/> 
    </behavior> 
web.configファイルで

<system.web> 
     <compilation debug="false" /> 
     <httpRuntime executionTimeout="1800"/> 
    </system.web> 

web.configファイル

ServicePointManager.DefaultConnectionLimit = 100; (Change in code) 

<system.net> 
     <connectionManagement> 
      <add address = "*" maxconnection = "100" /> 
     </connectionManagement> 
     </system.net> 

StackOverflowの上の多くの人々によって示唆されているように私は0にアプリケーションプールののIdleTimeoutプロパティを設定しました。

これまでストリームが使用されている場所では、私はすべての場所を処分しています。だからすべてのストリームが閉じられている。

誰がスレッドを中断しているのか、なぜ、スレッド中断開始の原因を追跡する手段やツールがあるのか​​を教えてください。

+0

が、それはクライアントがREQを中止することが可能である

その他代替ソリューションはDisposeなどを実装することができますこれはサーバー側でも例外を生成します。 – Jehof

+4

ASP.NETは必要に応じて常にワーカープロセスを起動して強制終了します。あなたのスレッドは単にASP.NETによってシャットダウンされるかもしれません。コンピュータで同時に実行できるスレッドの数を確認してください。また、テスト中にプロセッサのパフォーマンスを追跡しようとします。 – Alexandr

+0

プールされたコールの量を増やしますが、バッファサイズは増やしませんでした。私はそれのために多くの通話が落とされているという気持ちがあります。 – Franck

答えて

3

私はこの問題に遭遇しました。クライアントクラスの不適切な使用に至りました。

何が起きたかは、クライアントクラスがインスタンス化されてリソースを解放してスループットを低下させない場合です。非常に役に立たない例外「スレッドが中止されました」が発生します。これは、汎用がクライアントオブジェクトを作成し、コンストラクターを実装してメソッドを正しく処理するヘルパークラスを作成することによって解決されました。

一部のIIS例外は、実際の問題の原因にはあまり役立ちませんが、私の問題を解決するために行われた作業の一番下には、IISログを見ることしかできませんでした。具体的には「Failed Request Tracing Rules

これは役に立ちます。うまくいけば、私はあなたの欲求不満を解決することがわかります。

2

私は以前と同じようなことがあります。解決策は、廃棄方法メソッドを実装することによって、その範囲が終了した後でリソース/クライアントを解放することでした。入力されたクライアントを使用したときに自動的にリソースをクリーンアップするためにC#using文が成功しないとスローされた例外が実際の例外&がタイムアウトまたは他の例外のようないくつかの他の例外をスロー食べる暗黙の処分によってマスクされているので

問題が存在します。

C#の "using"ステートメントの結果、Dispose()が呼び出されます。これは、ネットワークエラーが発生したときに例外をスローする可能性のあるClose()と同じです。 Dispose()の呼び出しは暗黙のうちに "using"ブロックの閉じ括弧で行われるため、コードの記述とコードの読み取りの両方でこの例外の原因が気づかれなくなる可能性があります。これは、アプリケーションエラーの潜在的な原因を表します。あなたには、いくつかのexecptionが発生した場合にも、リソースを解放例外&の実際のソースを見つけることができるだけでなく、このように

MSDNから)あなたのようなリソースを解放する必要があります。

/// <summary> 
/// Calculator Client 
/// </summary> 
public partial class CalculatorClient : IDisposable 
{ 
    #region IDisposable implementation 

    /// <summary> 
    /// IDisposable.Dispose implementation, calls Dispose(true). 
    /// </summary> 
    void IDisposable.Dispose() 
    { 
     Dispose(true); 
    } 

    /// <summary> 
    /// Dispose worker method. Handles graceful shutdown of the 
    /// client even if it is an faulted state. 
    /// </summary> 
    /// <param name="disposing">Are we disposing (alternative 
    /// is to be finalizing)</param> 
    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      try 
      { 
       if (State != CommunicationState.Faulted) 
       { 
        Close(); 
       } 
      } 
      finally 
      { 
       if (State != CommunicationState.Closed) 
       { 
        Abort(); 
       } 
      } 
     } 
    } 

    /// <summary> 
    /// Finalizer. 
    /// </summary> 
    ~CalculatorClient() 
    { 
     Dispose(false); 
    } 

    #endregion 
} 

出典

Avoiding Problems with the Using Statement MSDN

Using and Disposing of WCF Clients

+0

遅れて返信して申し訳ありません。 ありがとうございました。 問題をできるだけ早く修正したいと思ったので、問題を解決したマシンのラムサイズを大きくすることでした。 – shivkumar

関連する問題