gpt4 book ai didi

memory-leaks - Erlang 应用程序中观察到的内存泄漏

转载 作者:行者123 更新时间:2023-12-03 18:18:20 26 4
gpt4 key购买 nike

让我把我的问题简单如下。我的是用 erlang 构建的网络路由器软件,但在特定情况下,我观​​察到 VM 显示的非常高的内存增长。

我有一个进程从套接字接收来自其他进程的二进制数据包。

这个过程,解析二进制数据包并将二进制数据包传递给一个gen_server(handle_cast被调用)

gen_server 再次在 ETS 表中存储一些信息并将数据包发送到对等服务器。

当对等服务器响应时,来自 ETS 的条目被删除,gen_server 响应第一个进程

此外,如果第一个进程(将数据包发送到 gen_server)在等待 gen_server 响应 5 秒后超时,它也会删除 gen_server 中的 ETS 条目并退出。


现在,当大量事件超时(由于对等服务器不可用)时,我观察到高内存增长,并且根据我研究过的 erlang 给出的“**binary**”和“**processes_used**”:memory使用大部分内存的命令。

但当事件处理成功时,情况并非如此。

最佳答案

丢失的内存基本上只能在三个地方:

  • 你的 gen_server 的状态
  • 看看你的状态,看看那里是否有一些大的或正在增长的东西
  • 您的进程邮箱
  • 请注意,在正常 handle_info 中总是有一些方法可以排出不匹配的消息(对于 gen_server receive 回调)是 Any ->条款。
  • 如果邮箱只是暂时填满,可能是因为接收过程太慢而无法产生消息。这通常是异步通信的问题。如果它只是不会破坏任何东西的临时爆发,这可能是有意的。
  • 在这种情况下,您可以优化接收过程
  • 或修复您的协议(protocol)以使用更少的消息
  • 如果您有多个接收消息的函数,请确保定期调用所有接收部分。不要忘记 Any ->条款。
  • 请注意,当您在 gen_servers 回调中进行处理时,不会收到任何消息,因此如果您需要更多时间在回调中,这将是必要的异步消息可能会堆积(例如,随机消息到达 + 固定处理时间会构建一个无限增长的队列,详情见 Queueing theory
  • 在您的 ETS 表中
  • 也许ETS中的信息没有被完全删除?在某些情况下忘记删除某些东西?
  • 关于memory-leaks - Erlang 应用程序中观察到的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5038459/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com