尖锐的 SNMP 异步方法泄漏堆栈内存

本文关键字:泄漏 堆栈 内存 异步方法 SNMP | 更新日期: 2023-09-27 18:33:57

我正在尝试新的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);
}

我将每个获取请求的 OID 数量限制为 25。我的应用程序连接到 c.50 SNMP 设备。每 5 分钟,计时器就会在循环中多次滴答并运行上述代码,以便在每个设备上轮询 c.100 OID。都很好。

问题是message.GetResponseAsync方法正在泄漏内存。每次轮询运行都会增加 6 或 7 MB 的应用程序内存使用量。使用 VS2015 内存性能分析器,我可以看到大量的 OverlappedData 对象,每个对象 65K,每次运行 message.GetResponseAsync 时,其数量都会增加。因此,运行它以每 5 分钟接收 c.200 SNMP 获取请求意味着我的应用程序的内存使用量迅速飙升。

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

谢谢贾尔斯

尖锐的 SNMP 异步方法泄漏堆栈内存

现在的临时答案。

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

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

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

已更新:此提交包含释放 args 对象的快速修复。但它尚未启用重用。