erlang 内存池分配

发布于 2021-12-04 07:02:23 字数 864 浏览 711 评论 2

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}]},

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

岁吢 2021-12-04 16:48:57

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

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

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

旧伤慢歌 2021-12-04 09:19:19

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

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文