多くのデータベース アクセスを実行できる可能性のある WCF デュプレックス サービス (net.tcp バインドによるセッション インスタンス化) があります。高 db アクセス ルーチンに入ると、WCF サービス呼び出しに応答しなくなります。
CPU 使用率を確認しましたが、高いですが 100% ではありません。これは 4 コア ボックスにあります。
実際のリクエストが WCF によって処理されていないようです。サービス操作が呼び出されないだけでなく、WCF スタックのさらに下に、呼び出されないセキュリティ カスタム動作がいくつかあります。これは、どういうわけかWCFがスレッドを使い果たしているため、アクセス用に新しいスレッドを割り当てることができないと思わせます。
サービスとの現在のセッションがいくつかある場合 (5 未満) に発生する可能性があるため、これはスロットリングの問題ではないと思います。
問題の DB 操作は、何千もの単一行の挿入です。これは、エンティティ フレームワークの内部キャッシュのメモリ蓄積を減らすために、500 回の呼び出しごとに破棄および再構築される単一のエンティティ フレームワーク コンテキストで行われます。ターゲット データベースは SQL Express 2008 R2 です。
このサービスにはかなりの数のワーカー スレッドがあります。すべてはタスク並列ライブラリによってインスタンス化されます... 一部は通常の短期間のタスク (CLR スレッドプールを使用) として、その他は長期実行タスク (独自の CLR スレッドを取得) ですが、これらはいずれも I/O スレッドではありません ( CLRが私が知らない魔法を行っていない限り)。DB 書き込みは長時間実行タスクで発生しています。
WCF スレッド、ワーカー スレッド、I/O スレッド、および WCF スロットリングの現在の状態を報告または視覚化できる WCF またはデバッグ診断ツールはありますか?
環境の概要
- WCF サービスは Windows サービス内でホストされます
- WCF サービスは net.tcp 二重バインディングを使用します
- WCF サービスはセッション ベースです (デュプレックス コントラクトで必要)
- Windows サービスのインスタンスは 1 つだけですが、WCF サービス オブジェクトの複数のインスタンスは、WCF の必要に応じてインスタンス化されます。
- WCF サービス操作は、Windows サービス内で持続するバックグラウンド スレッドに作業をすばやく委任します。すべての WCF 操作はすぐに返され、バックグラウンド スレッドによって生成された追加の結果が WCF 二重コールバック チャネルを介して細流化されます。
- すべての DB アクセスは、バックグラウンド ワーカー スレッドで行われます。長時間実行される作業に WCF スレッドは使用されません。
- WCF サービスには、1 つのカスタム セキュリティ動作があります。他の動作はありません (信頼できるメッセージングなど)。