【问题标题】:Sharp SNMP Async method leaking stack memorySharp SNMP Async 方法泄漏堆栈内存
【发布时间】:2016-02-13 16:34:53
【问题描述】:

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

我异步轮询 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 中的错误吗?

谢谢, 贾尔斯

【问题讨论】:

  • new UserRegistry() 用作GetResponseAsync 中的参数怎么样?
  • 我不太确定那是什么,但是将其实例化一次并将对象传递给对message.GetResponseAsync 的所有调用并没有任何区别。无论如何,我希望它会被 GC 捡起。
  • 很快就会看到。

标签: c# asynchronous snmp sharp-snmp


【解决方案1】:

现在是一个临时答案。

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

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

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

更新:this commit 包含处理 args 对象的快速修复。但它还不能重用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2021-11-06
    相关资源
    最近更新 更多