erlang 内存池分配

荒唐的_辉_辉_ 发布于 2016/01/21 11:20
阅读 678
收藏 0

Hi

   在服务器维护中, 发现erlang 虚拟机申请了很大的内存池, 而且二进制内存池的使用率特低,不到10%, 请问有什么方法解决这个问题呢?  怎么关闭erlang  二进制内存池这个功能呢?我网上看到

+MBacul 0 这个启动参数能禁掉二进制内存池。 试了下,不怎么管用, 求大神些指点指点。

谢谢!

 erlang:memory().

[{total,5915904320},

recon_alloc:memory(allocated).
  13216327024


[{{binary_alloc,4},
  [{sbcs_usage,1.0},
   {mbcs_usage,0.016481312461743083},
   {sbcs_block_size,0},
   {sbcs_carriers_size,0},
   {mbcs_block_size,38038024},
   {mbcs_carriers_size,2307948720}]},
加载中
0
f
fooy5460

之前也碰到erlang虚拟机申请了很大的虚拟内存;然后编译了个debug版本跟踪了一下;发现内存主要是同步线程和调度线程(scheduler)申请的;

同步线程数量通过启动参数+A控制的,比如+A30,每个同步线程申请大概65M+内存;

调度线程按系统核数来申请的,每个线程申请了70M+的内存;

这样32核,+A30参数最基本的启动4.2G左右;这就是看着吓人,在负荷小的时候,实际占用物理页很少;

但需要注意的是/proc/sys/vm/overcommit_memory参数设置,配置为2时,在虚拟内存使用较高时,erlang虚拟机可能无法启动。

0
格通
格通

根据我的项目情况来看,你的内存占有这么大的内存,尤其是二进制数据,很大可能是你处理的过程中,没有进行内存回收。我们项目就是tcp网络连接中保留了大量的二进制数据而导致的。

erlang的二进制数据是共享同一个堆的,这样会节省内存。但如果你没有回收内存,这个共享内存会越来越大。

至于内存回收操作,你可以参考rabbitmq项目中的background_gc.erl模块。

返回顶部
顶部