Erlang内存分配器的策略: BEAM有自己的内存分配器(如erts_alloc
)。这些分配器为了效率,可能会向操作系统申请比当前实际需求更大的内存块(carriers),然后自己管理这些内存块的分配和回收。这意味着即使Erlang内部释放了一些内存,分配器持有的这些内存块在操作系统层面看来仍然是被该进程占用的,直到分配器决定将整个carrier归还给操作系统。
在我实际观测中,连接数稳定的情况下:总内存一直在平均水平正负 2G 内都是正常的。属于正常波动。
PS: Erlang VM本身也有一些内存相关的限制参数(例如通过+MMsco
+MMscs
+MBas
+MBsco
+MBscs
等参数调整分配器行为和限制),但这些主要是指导BEAM内部如何管理内存,而不是硬性阻止它向OS申请更多内存。如果应用逻辑持续请求内存,VM会尽力满足,直到OS层面无法提供为止。如果没有影响到你的业务,最好不要去调。
这个不是 bug,升级了也解决不了,不需要升级。