【发布时间】:2018-09-25 15:08:16
【问题描述】:
我有一个 erlang 集群,其中 erlang:memory() 'total' 从空闲到忙碌的时间在 2-2.5GB 之间,日复一日。 ets 内存使用量约为 440M 并且无论如何都保持在那里。 ets 中的数据非常短暂,全天都在变化。保证明天的数据与今天的数据没有共性。
Linux top 说 beam 正在使用大约 10 GB。 free -m 'used' 同意这一点(机器实际上只运行梁)。系统的整体内存使用量定期增长,例如在 16GB 系统上每天增长 1%。节点之间存在一些差异,但差异不大,并且操作系统“已使用”内存始终是 erlang:memory() 总数的几倍。
erlang:system_info({allocator, ets_alloc}) 显示 20 个分配器。大多数数据看起来像这样(命令的完整输出是here):
{mbcs_pool,[{blocks,2054},
{blocks_size,742672},
{carriers,10},
{carriers_size,17825792}]},
1) 这是否意味着 742K 字节(字?)的内存实际上占用了 17M 的 OS 内存? 2) 正如this post 建议的那样,我们是否应该在VM args 中添加'+MEas bf',以减少开销? 3)我还能做些什么来避免实际内存不足?
这是 R17.5,但我们将在下一次部署(本周)中迁移到 R19.3。我们在当前部署中没有侦察,但将在下一次部署中添加它。此外,无法想象这很重要,但梁在高山容器内运行。
【问题讨论】:
-
谢谢,但这确实不是虚拟内存问题。 erlang上下文中的“VM”是Beam Virtual Machine的简写,是erlang代码执行的过程。虽然是的,虚拟内存不是物理内存,但如果碎片变得非常糟糕,我们最终可能会用完虚拟内存。