我正在为其异步方法尝试新的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中的错误吗?
谢谢, 贾尔斯
答案 0 :(得分:0)
现在临时回答。
泄漏是由SocketAsyncEventArgs
未重复使用引起的。如果管理员试图管理具有多个操作的代理,则应该重用此类对象(以及Socket
对象)。
目前的设计不允许这样的重复使用。因此,需要进行全面的重新设计。
我已经有了一些关于如何继续前进的想法,但可能它无法进入9.0版本。查看9.5是否可以是新设计的第一个版本。然后我会回去更新这个答案。
更新:this commit包含处理args对象的快速修复程序。但它还没有实现重用。