gpt4 book ai didi

linux - 类型为 "root-set"的内存重新分配错误 - Erlang

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:18 26 4
gpt4 key购买 nike

我一直在运行一个加密密集型应用程序,该应用程序生成伪随机字符串,具有特殊的结构和数学要求。在过去的 8 天里,它为每个节点生成了大约 170 万个凭证编号。生成过程是 CPU 密集型的,内存需求非常低。在 OTP-14B02 上运行的 Mnesia 是存储数据库,生成是在每个虚拟机中完成的。我在集群中有 3 个节点,所有 mnesia 表都是 disc_only_copies 类型。突然,随着 Solaris 机器上事件的增加(其他用户远程登录并启动网络服务器、ftp session 和其他任务),我的 bash shell 开始报告
fork:空间不足错误。

我的 erlang Vms 也出现了以下错误:

Crash dump was written to: erl_crash.dumptemp_alloc: Cannot reallocate 8388608 bytes of memory (of type "root_set").

通常,我们会遇到内存分配错误,而不是内存重定位错误,通常“堆” 类型的内存才是问题所在。这次,报告的内存类型是 "root-set" 类型。

Qn 1. 这个“root-set” 内存是什么?

Qn 2. 是否与 CPU 密集型事件有关? (为什么要问这个是因为当我开始任务时,机器对鼠标或键盘中断的响应太慢意味着 CPU 太忙或其他一些我现在无法解释的问题)

Qn 3. 这样的错误可以避免吗?如何 ?

最佳答案

fork: not enough space 消息表明这是操作系统设置的问题,但是:

Q1 - 根集

根集是垃圾收集器在堆中搜索事件数据时用作起点的东西。它通常从 VM 的寄存器开始,然后从堆栈开始,如果堆栈有对仍然需要事件的堆数据的引用。 Erlang 中可能还有其他我不知道的根源,但这些是您开始的基本内容。

它是恰好 8 兆字节空间的重新分配错误可能意味着两件事之一。要么堆中没有 8 MB 可用空间,要么堆碎片化得面目全非,因此虽然其中有 8 MB,但没有连续的此类空间。

Q2 - CPU 事件影响

此问题与 CPU 本身无关。您的内存不足。一个大的根集可能表明您正在进行一些非常深入的递归,其中您保留了大量指向数据的指针。您可以重写代码,使其在运行时进行尾调用并使用更少的内存。

您应该更担心键盘和鼠标的响应速度慢。这可能表明某些事情是不对的。在进程运行时,vmstat 1、sysstat、htop、dstat 或类似的东西是否显示任何奇怪的东西?您还想弄清楚内核或 C libc 是否由于内存受限而在这里做一些奇怪的事情。

Q3 - 如何修复

在不了解应用程序正在做什么的情况下,我不知道如何修复它。由于您有故障转储,您的第一直觉应该是使用故障转储查看器并查看转储。目标是找到一个使用大量内存或具有深堆栈的进程。从那里开始,您可以寻求限制该进程使用的内存量。通过重写代码以便它可以更早地释放内存,通过调整进程的垃圾收集设置(参见 erlang 手册页中的 spawn 选项),或者向系统添加更多内存。

关于linux - 类型为 "root-set"的内存重新分配错误 - Erlang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7204244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com