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

Abd*_*afi 6 erlang

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

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

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

我该如何解决这个问题?

Igo*_*man 5

如果有人会发现它作为此类问题的可能原因之一有用(因为我在任何地方都没有找到任何具体答案),我们在rabbitmq 服务器(Linux,64 位,持久队列,默认配置的水印)上遇到过类似的问题

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

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

问题在于一次重新排队过多的消息。我们的“监控”代码使用带有重新排队选项的“获取”消息,而不限制要获取和重新排队的消息数量(在我们的例子中 - 队列中的所有消息都是 4K)所以它一次尝试添加所有这些消息返回队列服务器失败并显示上述消息。

希望它能为某人节省几个小时。


Ada*_*erg 2

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

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