我需要你在调查Erlang内存消耗问题中提供帮助。多典型的问题,是吧?
我们有两种不同的部署方案。
- 在第一种方案中,我们在小型虚拟机(在Amazon AWS上)上运行许多相同的节点,每台机器一个节点。每台机器有4GB的RAM。
- 在另一种部署方案中,我们在大型裸机(具有64GB的RAM)上运行这些节点,每个机器有许多节点。在这种部署中,节点被隔离在docker容器中(内存限制设置为4GB)。
我注意到,docker化节点中的进程堆比非docker化节点中相同负载的堆占用了多达3倍的RAM。我怀疑非docker化节点中的垃圾收集更积极。不幸的是,我没有任何垃圾收集统计信息,但我想尽快获得它。
要提供更多信息,我应该说我们在Ubuntu 14.04上使用HiPE R17.1和默认内核。在两种方案中,我们每个节点运行8个调度器,并使用默认的fullsweep_after
标志。
我的盲猜测是Erlang默认的垃圾收集(以某种方式)依赖于/proc/meminfo
(在docker化环境中不是实际的)。我不是C语言专家,也不熟悉模拟器内部,那么有没有人能指导我查看Erlang源代码中负责垃圾收集的地方以及一些模拟器选项,我可以使用这些选项来调整此行为?
erlang:memory/0
获取内存数据时非常不同。 - zxq9erlang:memory/0
,发现erlang:memory(processes)
异常。此外,我还对某些监督程序下进程的堆栈进行统计(通过对每个监督程序下的进程使用erlang:process_info(Pid,total_heap_size)
获得)。 - Viacheslav Kovalev