1

クライアント ワークステーションで見られる問題を調査しています。この問題では、かなり大きな WinForms .NET 3.5 アプリケーションが、あらゆる種類のネットワーク操作を実行できなくなり、メイン スレッドで実行されているネットワーク操作が原因で最終的にフリーズします。

ネットワーク操作とは、新しいネットワーク接続を必要とするものすべてを意味します。アプリケーションは、複数の Oracle データベースと SOAP Web サービスに接続します。

アプリケーションのメモリ ダンプを調べると、さまざまなスレッドでアンマネージ コードへのさまざまなブロックされた呼び出しが示されます。

DNS ルックアップが停止しました ( System.Net.UnsafeNclNativeMethods+SafeNetHandlesXPOrLater.getaddrinfo)

開いているソケットが動かない ( System.Net.UnsafeNclNativeMethods+OSSOCK.WSAConnect)

閉じる ソケットが詰まっている ( System.Net.UnsafeNclNativeMethods+SafeNetHandles.closesocket)

Open ODBC スタック ( System.Data.Common.UnsafeNativeMethods.SQLDriverConnectW)

上記のすべてのアンマネージド スタックの上部は次のようになります。

0a90df4c 77858cd8 ntdll!ZwWaitForSingleObject+0x15
0a90df74 73c5716f ntdll!RtlIntegerToUnicodeString+0x20b
0a90dfbc 76f45db1 siifslsp!WSPStartup+0x483f

アプリケーションを再起動すると、正常に戻ります。これはある種のリソース リークを示唆していますが、どうすればこれを追跡できますか?

開いているネットワーク接続のインスタンスを確認したところ、次の数を確認できました。

  • System.Net.HttpWebRequest5 インスタンス
  • System.Net.Sockets.Socket11件
  • System.Data.Odbc.OdbcConnectionHandle4 インスタンス

これらは私には異常に高く見えません。

更新 1 - の切り捨てられた出力!FinalizeQueue

の出力は!FinalizeQueue、私にとって異常なことは何も示していません。私はそれをIO関連のものに限定しました。

0:024> !FinalizeQueue
SyncBlocks to be cleaned up: 0
MTA Interfaces to be released: 0
STA Interfaces to be released: 0
----------------------------------
generation 0 has 359 finalizable objects (41f35654->41f35bf0)
generation 1 has 0 finalizable objects (41f35654->41f35654)
generation 2 has 10697 finalizable objects (41f2af30->41f35654)
Ready for finalization 0 objects (41f35bf0->41f35bf0)
Statistics:
      MT    Count    TotalSize Class Name
6e612a38        1           20 System.Net.SafeLocalFree
6ea7e550        1           24 System.Net.Sockets.TcpClient
6a606c54        1           24 System.Data.Odbc.OdbcEnvironmentHandle
6e60f7f4        2           40 System.Net.SafeFreeAddrInfo
05da845c        2           40 System.Net.SafeCloseSocket+InnerSafeCloseSocket
0642c010        2           56 System.Net.SafeCloseSocketAndEvent
6e6106bc        4           96 System.Net.SafeRegistryHandle
6e6105d0        4          112 System.Net.SafeCloseSocketAndEvent
6a6069bc        4          112 System.Data.Odbc.OdbcConnectionHandle
6a6060c8        4          256 System.Data.Odbc.OdbcConnection
6e60f764       11          264 System.Net.SafeCloseSocket
6e6115cc        7          336 System.Net.Sockets.NetworkStream
66e60eeec       11          836 System.Net.Sockets.Socket

Total 11056 objects

更新 2 -!locksとを使用し!critsecてブロックの場所を確認する

の出力!critsecは次のとおりです。

0:002> !critsec 73c7147c

CritSec siifslsp!GetLspGuid+1a0fc at 73c7147c
WaiterWoken        No
LockCount          8
RecursionCount     1
OwningThread       5f24
EntryCount         0
ContentionCount    8
*** Locked

が何5f24を指しているのか不明。の出力には、の!Threads付いたスレッドは表示されません。OSID5f24

4

2 に答える 2

1

明確な答えがないことは認めますが、ここにいくつかの提案があります。

まず、このブログ投稿!waitlistで説明されているように、WinDbg でコマンドを使用して、スレッドがブロックしているものを特定してみてください。これにより、さまざまなスレッドがブロックされている理由を説明できる手がかりが得られる可能性があります。

これは、スレッドをブロックしているものを見つけるために深く掘り下げる方法を説明する別の便利なブログ投稿です。

良い情報のもう 1 つのソースはEvent Viewer、具体的にはthe Windows Logs -> Systemセクションです。Errorここでエントリをスキャンして、または何かを探して、Warningsそれらの内容を確認できます。そこにネットワーク関連のメッセージが投稿されている可能性がありますが、あなたにはわかりません。

他にも役立つ可能性のある情報を見つけたら、この回答を更新し続けます。

于 2013-03-12T20:48:06.003 に答える
0

.NET は、既定でリモート接続の数を 2 に制限します。

次のプロパティが適切に設定されていることを確認してください。

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

詳細については、次の MSDN ページを参照してください。

http://msdn.microsoft.com/en-gb/library/system.net.configuration.connectionmanagementelement.maxconnection(v=vs.100).aspx

于 2013-03-14T11:20:09.657 に答える