为什么Erlang/Elixir observer内存使用数不相加?
我从Elixir开始,在使用iex连接到远程生产节点时观察到一些奇怪的行为 如下面的屏幕截图所示,观察者报告总共使用了92MB内存。但是,当您将进程、原子、二进制文件、代码和ets的内存消耗汇总起来时,结果是:~69MB 所以,我的第一个问题是额外的23MB内存是从哪里来的?我很确定这不仅仅是一个报道问题。因为当我查看Kubernetes吊舱的内存消耗时,它是~102MB,这与观测者显示的数字一致 我唯一能想到的是那些23MB还没有被垃圾收集。我的假设有效吗?如果是的话,这个容器已经启动6个小时了。我从一开始就在监控内存消耗。这不应该是垃圾收集了吗为什么Erlang/Elixir observer内存使用数不相加?,erlang,elixir,phoenix-framework,Erlang,Elixir,Phoenix Framework,我从Elixir开始,在使用iex连接到远程生产节点时观察到一些奇怪的行为 如下面的屏幕截图所示,观察者报告总共使用了92MB内存。但是,当您将进程、原子、二进制文件、代码和ets的内存消耗汇总起来时,结果是:~69MB 所以,我的第一个问题是额外的23MB内存是从哪里来的?我很确定这不仅仅是一个报道问题。因为当我查看Kubernetes吊舱的内存消耗时,它是~102MB,这与观测者显示的数字一致 我唯一能想到的是那些23MB还没有被垃圾收集。我的假设有效吗?如果是的话,这个容器已经启动6个
第二个问题:我是否可以对Erlang VM/Elixir配置进行一些调整,以优化内存占用?我也一直在尝试解决OTP应用程序中的内存管理问题,其中一个对我特别有用的工具是Fred Hebert编写的库。特别是
recon_alloc
模块,它提供了有关Erlang VM内存使用情况的非常有用的信息
丢失的兆字节
以下引文直接取自recon\u alloc:memory()
函数的文档,可能会让您了解正在发生的事情:
“已分配”报告的内存应大致与操作系统的内存相匹配
报告。如果这一数额相差很大,则可能是
表示有人直接在C中分配内存,在
Erlang自己的分配器——一个巨大的警告信号。目前有
这三个内存分配的来源不包括在内
值:mseg分配器中的缓存段,分配的任何内存
作为一个超级载体,在存储过程中分配内存的小块
在初始化内存分配器之前启动。还要注意
内存使用率低可能是内存碎片化的标志,其中
建议使用案例分析哪个特定分配器有故障
因此,我认为额外的23MB内存使用可能是由于一些不希望的分配,或者可能是由于碎片
调整(非常小心/!\) 至于第二个问题,Erlang中有一个名为的工具,它还描述了内存分配器的手动配置。可以通过向仿真器传递命令行标志来完成,例如:
erl+SOMEFLAG+SOMEOTHERFLAG
但是文档中有一个大的红色警告,它强烈地表明弄乱这些标志可能会导致比默认配置更糟糕的行为
因此,我的建议是,如果这真的是解决问题的唯一方法,那么就求助于这些修改。在这种情况下,有一个关于Erlang运行时系统的介绍帮助我理解了一些方面,因此我建议事先阅读一下
注意:这里是在黑暗中拍摄的,不直接回答您的问题,但仔细检查二进制文件的运行情况可能会有用,因为我看到观察家报告了13MB。根据其大小(小于或大于64字节),它们存储在进程堆中或通过引用访问。我面临着案例1,大量小型二进制文件堆积在一起,最终导致我的系统崩溃
在尝试解决这些问题时,我发现了一些其他有用的资源:
- 以下是弗雷德·赫伯特(Fred Hebert)的一篇文章的具体片段:
[erlang:garbage_collect(Pid)| | Pid您需要深入虚拟机以获得准确的数字,但也有堆栈、虚拟机,可能还有一个算法在工作,它会增加分配给进程的页面(最有可能是“总计”的数字)以较大的增量。有什么特别的原因需要使用RAM的每个字节吗?通常,我根本不看这些统计数据,我在RPi之类的内存受限设备上做了很多工作……这太好了!感谢您的详细响应!很高兴看到还不算太晚!非常欢迎:)
Processes 19.00 MB
Atoms 0.97 MB (969 kB)
Binaries 13.00 MB
Code 28.00 MB
ETS 7.69 MB (7685 kB)
-------------------
Total 68.66 MB