.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
でも、