erlang 内存池分配
Hi
在服务器维护中, 发现erlang 虚拟机申请了很大的内存池, 而且二进制内存池的使用率特低,不到10%, 请问有什么方法解决这个问题呢? 怎么关闭erlang 二进制内存池这个功能呢?我网上看到
+MBacul 0 这个启动参数能禁掉二进制内存池。 试了下,不怎么管用, 求大神些指点指点。
谢谢!
erlang:memory().
[{total,5915904320},
recon_alloc:memory(allocated).
13216327024
[{sbcs_usage,1.0},
{mbcs_usage,0.016481312461743083},
{sbcs_block_size,0},
{sbcs_carriers_size,0},
{mbcs_block_size,38038024},
{mbcs_carriers_size,2307948720}]},
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
根据我的项目情况来看,你的内存占有这么大的内存,尤其是二进制数据,很大可能是你处理的过程中,没有进行内存回收。我们项目就是tcp网络连接中保留了大量的二进制数据而导致的。
erlang的二进制数据是共享同一个堆的,这样会节省内存。但如果你没有回收内存,这个共享内存会越来越大。
至于内存回收操作,你可以参考rabbitmq项目中的background_gc.erl模块。
之前也碰到erlang虚拟机申请了很大的虚拟内存;然后编译了个debug版本跟踪了一下;发现内存主要是同步线程和调度线程(scheduler)申请的;
同步线程数量通过启动参数+A控制的,比如+A30,每个同步线程申请大概65M+内存;
调度线程按系统核数来申请的,每个线程申请了70M+的内存;
这样32核,+A30参数最基本的启动4.2G左右;这就是看着吓人,在负荷小的时候,实际占用物理页很少;
但需要注意的是/proc/sys/vm/overcommit_memory参数设置,配置为2时,在虚拟内存使用较高时,erlang虚拟机可能无法启动。