夏普 SNMP 异步方法泄漏堆栈内存

Sharp SNMP Async method leaking stack memory

我正在尝试新的 9.0.0 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 中的错误吗?

谢谢, 贾尔斯

现在临时回答。

泄漏是由于SocketAsyncEventArgs没有被重用造成的。如果经理试图管理具有多个操作的代理,则应重用此类对象(以及 Socket 对象)。

当前的设计不允许这样的重用。因此,需要进行整体重新设计。

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

更新:this commit 包含一个快速修复来处理 args 对象。但它还没有启用重用。