夏普 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 对象。但它还没有启用重用。
我正在尝试新的 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 对象。但它还没有启用重用。