Linux “类型的存储器”;“根集”;重新分配错误-Erlang

Linux “类型的存储器”;“根集”;重新分配错误-Erlang,linux,erlang,solaris,Linux,Erlang,Solaris,我一直在运行一个加密密集型应用程序,该应用程序生成具有特殊结构和数学要求的伪随机字符串。在过去的8天里,它为每个节点生成了大约170万个凭证编号。生成过程是CPU密集型的,内存需求非常低。 运行在OTP-14B02上的Mnesia是存储数据库,生成在每个虚拟机内完成。我在集群中有3个节点,所有的mnesia表都是disc\u only\u拷贝type。突然,随着Solaris机箱上的活动增加(其他用户远程登录并启动Web服务器、ftp会话和其他任务),我的bash shell开始报告一个分叉:空

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

我的erlang虚拟机也出现以下错误:

Crash dump was written to: erl_crash.dump temp_alloc: Cannot reallocate 8388608 bytes of memory (of type "root_set"). 崩溃转储已写入:erl_Crash.dump 临时分配:无法重新分配8388608字节的内存(类型为“根集合”)。 通常,我们得到的是内存分配错误,而不是
内存重新定位错误
,通常
类型的内存是“堆”
的问题。这次,报告的内存类型是类型
“根集”

问题1。这是什么
“根集”
内存

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


问题3。这样的错误能避免吗?怎么做

分叉:没有足够的空间
消息表明这是操作系统设置的问题,但是:

Q1-根集 根集是垃圾收集器在搜索堆中的活动数据时用作起点的集合。它通常从VM的寄存器开始,如果堆栈引用了仍然需要活动的堆数据,则从堆栈开始。我不知道Erlang中可能还有其他的根,但这些是你开始的基础

这是一个8兆字节空间的重新分配错误,这可能意味着两件事之一。要么堆中没有8MB的空闲空间,要么堆被分割得面目全非,因此虽然堆中有8MB,但没有连续的空间

Q2-CPU活动影响 问题与CPU本身无关。您的内存不足。一个大的根集可能表明您有一些非常深入的递归,其中您保留了大量指向数据的指针。您可以重写代码,使其成为尾部调用,并在操作时使用更少的内存

您应该更担心键盘和鼠标的响应时间太慢。这可能表明有些事情不对。当进程运行时,vmstat 1、sysstat、htop、dstat或类似文件是否显示任何异常?您还需要弄清楚内核或libc是否由于内存受限而在这里做了一些奇怪的事情

问题3-如何修复
我不知道如何修复它,而不知道应用程序正在做什么。由于您有一个崩溃转储,您的第一反应应该是使用崩溃转储查看器查看转储。目标是找到一个使用大量内存的进程,或者一个具有深层堆栈的进程。从那时起,您可以设法限制进程正在使用的内存量。通过重写代码以便可以提前释放内存、调整进程的垃圾收集设置(请参阅erlang手册页中的“生成”选项),或者向系统添加更多内存。

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

Q1-根集 根集是垃圾收集器在搜索堆中的活动数据时用作起点的集合。它通常从VM的寄存器开始,如果堆栈引用了仍然需要活动的堆数据,则从堆栈开始。我不知道Erlang中可能还有其他的根,但这些是你开始的基础

这是一个8兆字节空间的重新分配错误,这可能意味着两件事之一。要么堆中没有8MB的空闲空间,要么堆被分割得面目全非,因此虽然堆中有8MB,但没有连续的空间

Q2-CPU活动影响 问题与CPU本身无关。您的内存不足。一个大的根集可能表明您有一些非常深入的递归,其中您保留了大量指向数据的指针。您可以重写代码,使其成为尾部调用,并在操作时使用更少的内存

您应该更担心键盘和鼠标的响应时间太慢。这可能表明有些事情不对。当进程运行时,vmstat 1、sysstat、htop、dstat或类似文件是否显示任何异常?您还需要弄清楚内核或libc是否由于内存受限而在这里做了一些奇怪的事情

问题3-如何修复 我不知道如何修复它,而不知道应用程序正在做什么。由于您有一个崩溃转储,您的第一反应应该是使用崩溃转储查看器查看转储。目标是找到一个使用大量内存的进程,或者一个具有深层堆栈的进程。从那时起,您可以设法限制进程正在使用的内存量。通过重写代码以便可以更早地释放内存,或者通过调整进程的垃圾收集设置(请参阅erlang手册页中的spawn选项),或者通过向系统添加更多内存