0

非同期メソッドについて、SharpSNMP の新しい 9.0.0 RC1 リリースを試しています。使い方は簡単で、実際には古い同期方式のドロップイン代替品です。

OID のリストを非同期的にポーリングする私のコードは次のとおりです。

// create a new get request message
var message = new GetRequestMessage(Messenger.NextRequestId, VersionCode.V2, SNMPReadCommunity, oids);

// get a new socket
using (Socket udpSocket = SNMPManager.GetSocket())
{
    // wait for the response (this is async)
    var res = await message.GetResponseAsync(SNMPManager, new UserRegistry(), udpSocket);

    // check the variables we received
    CheckSnmpResults(res.Pdu().Variables);
}

get-request ごとの OID の数を 25 に制限しています。私のアプリケーションは、c.50 の SNMP デバイスに接続しています。5 分ごとにタイマーが作動し、ループ内で上記のコードを数回実行して、各デバイスで約 100 個の OID をポーリングします。すべて良い。

問題は、message.GetResponseAsyncメソッドがメモリ リークを起こしていることです。ポーリングを実行するたびに、アプリケーションのメモリ使用量が 6 MB または 7 MB 増加します。VS2015 メモリ プロファイラーを使用すると、多数のOverlappedDataオブジェクト (それぞれ 65K) を確認できます。このオブジェクトの数は、実行するたびに増加しますmessage.GetResponseAsync。したがって、これを実行して 5 分ごとに c.200 の SNMP get-request を受信すると、アプリケーションのメモリ使用量が急激に増加します。

message.GetResponseAsyncどういうわけか間違って使用していますか?これは SharpSNMPLib のバグですか?

ありがとう、ジャイルズ

4

1 に答える 1

0

現時点での仮の回答です。

漏れの原因は、SocketAsyncEventArgs再利用しないことです。Socketマネージャーが複数の操作でエージェントを管理しようとする場合は、この種のオブジェクトを (オブジェクトと同様に) 再利用する必要があります。

現在の設計では、このような再利用は許可されていません。したがって、全体的な再設計が必要です。

先に進む方法についてはすでにいくつかのアイデアがありますが、おそらく 9.0 のリリースには間に合わないでしょう。9.5 が新しいデザインの最初のリリースになるかどうかを確認してください。そして、戻ってこの回答を更新します。

更新:このコミットには、args オブジェクトを破棄するための簡単な修正が含まれています。ただし、再利用はまだ有効になっていません。

于 2016-02-11T12:12:37.823 に答える