3

.NET アプリで I/O 完了スレッド リークの可能性を見つけようとしています。時々、 ThreadPool.GetAvailableThreadsを使用して、利用可能な I/O 完了スレッドの数をサンプリングしています。ある時点で、使用可能なスレッドの数が (数分で) 1000 から 1 に低下し始めます。

使用可能なスレッドが 1 つになると、メモリ リーク、エラー、実行の遅延などは見られません。

windbg で !threads を実行すると、〜 700 個のスレッドが表示されますが、スレッドプールからのものではなく、ほとんどが XXXX でマークされています (私が知る限り、GC がまだスレッドを収集していないことを意味します)。たとえば、 : XXXX 2a4 1630 37d54610 1400 有効 00000000:00000000 004b70d8 0 Ukn (または MTA)

これをどのようにデバッグできますか?完了スレッドのコールスタックを確認するにはどうすればよいですか?

!threadpool を実行すると、次のようになります。

CPU 使用率: 31% ワーカー スレッド: 合計: 2047 実行中: 2047 アイドル: 0 MaxLimit: 2047 MinLimit: 2 キュー内の作業要求: 0 --------------------- ----------------- タイマー数: 4 -------------------------------- ---------- 完了ポート スレッド:Total: 1000 Free: 1 MaxFree: 4 CurrentLimit: 999 MaxLimit: 1000 MinLimit: 2

でも、

4

1 に答える 1

2

!sos.name2ee mscorlib.dll System.Threading.Thread を実行し、MethodTable をメモします。次に、!sos.dumpheap -mt [MT] を実行します。これにより、スレッド オブジェクトのリストが表示されます。次に !sos.gcroot [THREADOBJ] を実行して、何が保持されているかを確認します。

于 2013-01-09T13:33:33.223 に答える