Erlang的“系统”内存部分不断增长

我有以下模式的应用程序:

  • 2个长时间运行的进程在空闲时间后进入休眠状态,并且其内存消耗按预期降低
  • N(0 <N <100)工作进程在空闲时间超过10秒时进行一些工作并休眠,或者闲置超过两小时时终止
  • 在夜间,当没有任何活动时,进程内存回到几乎与应用程序启动时相同的值,因为所有工作人员都已经死亡。
  • 问题在于“系统”部分不断增长(大约1GB /周)。

    我的问题是,如何调试那里存储的内容或谁在该区域分配内存,而不是释放它。

    我已经测试了列表:keysearch / 3,它似乎没有泄漏内存,因为这是我使用的唯一本地东西(没有端口,没有驱动程序,没有NIF,没有BIF,没有)。 Erlang版本是R15B03。

    这里是目前的erlang:memory()输出(轻微的流量,应用程序从03年2月开始):

    [{total,378865650},
    {processes,100727351},
    {processes_used,100489511},
    {system,278138299},
    {atom,1123505},
    {atom_used,1106100},
    {binary,4493504},
    {code,7960564},
    {ets,489944},
    {maximum,402598426}]
    

    这是一个64位系统。 正如你所看到的,“系统”部分有〜270MB,“进程”在100MB左右(在夜间下降到〜16MB)。


    看来我发现了这个问题。

    我有一个“process_killer”gen_server,其中进程可以订阅定期GC或杀死。 它的订阅功能在某些进程收到的每个消息上被调用,以推迟GC / kill(类似于重新设置)。

    这个过程执行一个erlang:monitor,如果这个监视器没有被监控,就会捕获一个死进程并将其从监视列表中删除。 如果我评论我们对每个处理消息的重新订阅行,“系统”区域似乎表现正常。 这意味着这是我的process_killer中的一个漏洞,它监控ref(请记住,您可以多次调用erlang:monitor并且每次调用都会创建一个引用)。

    我引导了这个想法,因为我测试了一个简单的模块,它在一个循环中调用了erlang:monitor,并且在每次调用中我看到了〜13字节的“系统”区域。

    工人们自己也没问题,因为他们无论如何都会带着监视器一起死去。 有一个长时间的运行(从应用程序开始,停止使用应用程序),将所有消息分发给调用GC重新接收每条消息的工作人员,所以我们讨论的是每个成千上万个监视器小时,从未发布。

    我在这里写这个答案供将来参考。

    TL; DR; 确保你在长时间运行的过程中不泄漏监控参考。

    链接地址: http://www.djcxy.com/p/69165.html

    上一篇: Erlang "system" memory section keeps growing

    下一篇: What happened to QListViewItem in qt4?