Sharp SNMP Async方法泄漏堆栈内存

时间:2016-02-10 10:43:54

标签: c# asynchronous snmp sharp-snmp

我正在为其异步方法尝试新的9.0.1 RC1版本的SharpSNMP。它易于使用 - 实际上是旧同步方法的直接替代品。

我以异步方式轮询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分钟,计时器会循环并在循环中多次运行上述代码,以便在每个设备上轮询c.100 OID。一切都好。

问题是message.GetResponseAsync方法正在泄漏内存。每次轮询运行都会为我的应用程序的内存使用量增加6或7 MB。使用VS2015内存分析器,我可以看到大量的 OverlappedData 对象,每个65K,每次运行message.GetResponseAsync时其数量都会增加。因此,运行此命令每5分钟接收一次c.200 SNMP get-requests意味着我的应用程序的内存会快速使用火箭。

我是否以某种方式错误地使用message.GetResponseAsync?这是SharpSNMPLib中的错误吗?

谢谢, 贾尔斯

1 个答案:

答案 0 :(得分:0)

现在临时回答。

泄漏是由SocketAsyncEventArgs未重复使用引起的。如果管理员试图管理具有多个操作的代理,则应该重用此类对象(以及Socket对象)。

目前的设计不允许这样的重复使用。因此,需要进行全面的重新设计。

我已经有了一些关于如何继续前进的想法,但可能它无法进入9.0版本。查看9.5是否可以是新设计的第一个版本。然后我会回去更新这个答案。

更新:this commit包含处理args对象的快速修复程序。但它还没有实现重用。