7

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

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

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

我该如何解决这个问题?

4

4 回答 4

5

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

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

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

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

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

于 2014-09-29T14:11:57.847 回答
4

erl_crash.dump使用Crashdump Viewer 查看该文件:

/usr/local/lib/erlang/lib/observer-1.0/priv/bin/cdv erl_crash.dump

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

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

于 2012-06-15T09:40:46.137 回答
2

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

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

于 2012-06-15T06:39:51.573 回答
1

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

于 2012-06-15T09:10:16.163 回答