Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Erlang/Elixir observer内存使用数不相加?_Erlang_Elixir_Phoenix Framework - Fatal编程技术网

为什么Erlang/Elixir observer内存使用数不相加?

为什么Erlang/Elixir observer内存使用数不相加?,erlang,elixir,phoenix-framework,Erlang,Elixir,Phoenix Framework,我从Elixir开始,在使用iex连接到远程生产节点时观察到一些奇怪的行为 如下面的屏幕截图所示,观察者报告总共使用了92MB内存。但是,当您将进程、原子、二进制文件、代码和ets的内存消耗汇总起来时,结果是:~69MB 所以,我的第一个问题是额外的23MB内存是从哪里来的?我很确定这不仅仅是一个报道问题。因为当我查看Kubernetes吊舱的内存消耗时,它是~102MB,这与观测者显示的数字一致 我唯一能想到的是那些23MB还没有被垃圾收集。我的假设有效吗?如果是的话,这个容器已经启动6个

我从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