【发布时间】:2016-02-11 04:19:41
【问题描述】:
在调查 Erlang 内存消耗问题时,我需要您的帮助。多么典型,不是吗?
我们有两种不同的部署方案。
- 在第一个方案中,我们在小型虚拟机(在 Amazon AWS 中)上运行许多相同的节点, 每台机器一个节点。每台机器都有 4Gb 的 RAM。
- 在另一个部署方案中,我们在大型裸机机器(具有 64 Gb 的 RAM)上运行此节点,每台机器有许多节点。在此部署中,节点被隔离在 docker 容器中(内存限制设置为 4 Gb)。
我注意到,与负载相同的非 dockerized 节点中的堆相比,dockerized 节点中的进程堆占用的 RAM 高达 3 倍。我怀疑非 dockerized 节点中的垃圾收集更具侵略性。 不幸的是,我没有任何垃圾收集统计信息,但我想尽快获得它。
为了提供更多信息,我应该说我们在带有股票内核的 Ubuntu 14.04 上使用 HiPE R17.1。在这两种方案中,我们每个节点运行 8 个调度程序,并使用默认的 fullsweep_after 标志。
我的盲目建议是,Erlang 默认垃圾收集(不知何故)依赖于/proc/meminfo(这在 dockerized 环境中并不实际)。
我不是 C-guy 也不熟悉模拟器内部结构,所以有人可以指出 Erlang 源代码中负责垃圾收集的地方以及我可以用来调整这种行为的一些模拟器选项吗?
【问题讨论】:
-
Erlang 社区在这个网站上非常稀少(不过,了解内部原理的人知道内部原理)。您可能还想把它放在邮件列表中;那里有很多人对内部结构了解很多。
-
另外,请说明您是如何获得该内存消耗数据的。如果它来自诸如 top 或 /proc/meminfo 之类的 OS 实用程序,那么您看到的原因可能与您从
erlang:memory/0获取内存数据的原因大不相同。 -
我正在使用一些不同的方式直接在 erlang 节点上收集统计信息。特别是我用
erlang:memory/0,看到erlang:memory(processes)异常。我也有一些特定主管下的进程堆统计数据(我通过erlang:process_info(Pid, total_heal_size)在主管下的每个进程上获得它。
标签: garbage-collection erlang docker