无法分配298930300字节的内存(类型为“old_heap”)

时间:2012-06-15 00:27:20

标签: erlang

使用+ P(即并发进程的最大数量)进行负载测试我的erlang服务器的进程数增加(100,200,3000,....),以及让10进程向其余进程发送1条消息在创建的进程中,我在erlang控制台上收到了一条消息:

  

“崩溃转储被写入:erl_crash.dump.eheap_alloc:无法分配298930300字节的内存(类型为”old_heap“)。异常终止”。

我正在使用Windows XP。创建流程(它正在工作)时没问题。在进程开始通信(发送hi& receive hello)之后发生崩溃,这是我唯一的问题(顺便说一句,+ hms设置进程的默认堆大小)。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

如果有人会发现它有用,可能是造成这种问题的原因之一(因为我还没有找到任何具体的答案) 我们遇到过与rabbitmq服务器类似的问题(linux,64bit,持久队列,默认配置的水印)

eheap_alloc:无法分配yyy字节的内存(类型"堆")

eheap_alloc:无法分配xxx字节的内存(类型为" old_heap")

问题在于立即重新排队太多消息。我们的监控"使用的代码" get"带有重新排队选项的消息,不限制要获得的消息数量。重新排队(在我们的例子中 - 队列中的所有消息是4K) 因此,它一度尝试将所有这些消息添加回队列,服务器因上述消息而失败。

希望它可以节省几个小时的时间。

答案 1 :(得分:2)

你内存不足。尝试减少默认堆大小或限制启动的进程数。

更高级的解决方案包括分析您的应用程序以查看是否可以在那里保存一些内存,例如更好地共享二进制文件或减少使用列表和大型消息(将数据复制到它发送到的每个进程)。

答案 2 :(得分:2)

使用Crashdump Viewer

查看该erl_crash.dump文件
/usr/local/lib/erlang/lib/observer-1.0/priv/bin/cdv erl_crash.dump

(对于Unix路径表示道歉;您应该能够在Windows上的安装中找到cdv.bat。)

查看进程列表;根据我的经验,通常会有一个非常长的消息队列进程,你没想到它。

答案 3 :(得分:1)

您的一个进程尝试分配近300MB内存。您的服务器中可能存在内存泄漏。在适当的设计中,如果不是这样的话,你不应该在一个进程中有这么大的堆。