2014-10-26 157 views
3

我需要你的帮助来调查Erlang内存消耗的问题。有多典型,不是吗?Erlang垃圾回收

我们有两种不同的部署方案。

  • 在第一方案中,我们上运行小的虚拟机有许多相同的节点(在亚马逊AWS),每个机器 一个节点。每台机器都有4Gb的RAM。
  • 在另一个部署方案中,我们在大型裸机上运行这个节点(具有64 Gb的RAM),每台机器上有许多节点。在此部署中,节点在docker容器中隔离(内存限制设置为4 Gb)。

我已经注意到,dockerized节点中的进程堆占用的内存高达3倍,而堆栈的负载却是相同的非dockerized节点。我怀疑非dockerized节点中的垃圾收集更具侵略性。 不幸的是,我没有任何垃圾收集统计信息,但我想尽快获得它。

为了提供更多信息,我应该说我们在Ubuntu 14.04上使用HiPE R17.1和股票内核。在这两种方案中,我们正在为每个节点运行8个调度程序,并使用默认的fullsweep_after标志。我暗暗的建议是,Erlang的默认垃圾收集依赖(不知何故)/proc/meminfo(这在dockerized环境中并不实际)。 我不是C人,也不熟悉模拟器的内部,所以有人可能会指向我负责垃圾收集的Erlang源代码以及一些可用于调整此行为的模拟器选项?

+0

Erlang的社区是在这个网站非常薄的(这里的人谁知道内部* *知道的内部,虽然)。你可能也想把它放在邮件列表中;那里的很多人都知道很多关于内部的知识。 – zxq9 2014-10-26 21:06:40

+0

另外,请告诉你如何获得内存消耗的数字。如果它来自顶级或/ proc/meminfo等操作系统实用程序,那么您看到的原因可能与从erlang:memory/0中获取内存数字的情况完全不同。 – zxq9 2014-10-26 21:10:29

+0

我使用一些不同的方式直接在erlang节点上收集统计信息。特别是,我使用'erlang:memory/0',看到'erlang:memory(processes)'异常。另外,我还有一些关于某些主管(我通过erlang:process_info(Pid,total_heal_size)''在监督员的每个进程中获得的进程堆的统计信息。 – 2014-10-27 10:07:42

回答

1

首先要知道的是,我在Erlang的垃圾回收是基于进程的。每个过程在自己的时间都是GC,并且彼此独立。因此,系统中的垃圾收集只依赖于进程中的数据,而不是操作系统本身。

也就是说,从Eralang的观点和系统的角度来看,内存消耗可能存在一些差异。这就是为什么将erlang:memory与您的系统所说的内容进行比较总是一个好主意(它可能会显示一些二进制泄漏或其他内存问题)。

如果您想了解更多一点关于Erlang的内部,我建议这两个会谈:

https://www.youtube.com/watch?v=QbzH0L_0pxI

https://www.youtube.com/watch?v=YuPaX11vZyI

从你的内存管理的好一点的调试,我可以reccomend开始http://ferd.github.io/recon/

+1

感谢您的链接!我已经尽可能使用'recon'我有很好的关于erlang:memory/0的统计信息,以及我在主机上看到的内容,同时我也搜索了bin漏洞,但是二进制利用并没有让我受到影响,只有一件奇怪的事情 - 异常erlang处理堆使用情况(如'erlang:memory(processes)'或'erlang:process_info(total_heap_size)'所示)。 – 2014-10-27 09:49:15

+1

不应该使用erlang:memory(processes_used)来实际处理堆大小吗? – mpm 2014-10-27 11:42:52

+0

呃,是的,我忘记了这个:'erlang:memory(processes)'代表分配的内存和'erlang:memory(processes_used)'代表实际使用的内存,对吗?我还有每个erlang分配器(包括'eheap_alloc')。所有这些metrix(processes,processes_used和eheap_alloc)几乎是相同的(每个Gb加上 - 减少几兆字节)。 – 2014-10-27 11:56:24