0

我一直在功能强大的服务器上运行 erlang 应用程序。但是,有时,您无法避免此类内存错误,尤其是当用户很多时

崩溃转储被写入:erl_crash.dump
eheap_alloc:无法分配 467078560 字节的内存(“堆”类型)。
更烦人的是你有一个 20GB 内存的服务器,比如 8 个内核。看看 erlang 说的内存,它无法分配,这就是它崩溃的原因,也令人不安,因为与服务器的库存相比,它的内存非常少。

我今天的问题(我希望它没有关闭),是什么操作系统配置可以完成(考虑 RedHat、Solaris、Ubuntu 或 Linux),以使其在需要时为 erlang VM 提供更多内存?

如果要在此类功能强大的服务器上运行 erlang 应用程序,那么对于底层操作系统应该考虑哪些内存考虑(在 erlang 之外)?

问题背景
Erlang 消耗主内存,尤其是当进程数以千计时。我正在使用Yaws Web Server. 在同一个节点上,我让 Mnesia 运行大约 3 个ram_copies表。它是一个通知系统,作为运行在 Intranet 上的大型 Web 应用程序的一部分。用户通过 JSONP 从运行在不同 Web 服务器和不同硬件上的主应用程序访问这个系统。每个用户连接都直接向 mnesia 查询它需要的任何数据。然而,随着用户的增加,我总是得到crash dump. 我已经尽可能地调整了应用程序本身,将代码清理为标准,使用比字符串更多的二进制文件等避免了偏航进程和 mnesia 之间的 gen_servers 等单点,以便每个连接直接命中 mnesia。该服务器功能强大,具有大量 RAM 和磁盘空间。但是,当我的节点需要更多内存时会崩溃,这就是为什么我需要找到一种方法来强制操作系统将更多内存扩展到 erlang。操作系统是REDHAT ENTERPRISE 6

4

2 回答 2

4

这可能是因为您在 32 位模式下运行,只有大约 4 GB 的 RAM 是可寻址的。尝试切换到 64 位版本的 erlang 并重试。

于 2012-10-30T09:14:12.187 回答
1

我读过的几个不同的服务器教程说,如果服务以非 root 用户身份运行,您可能必须编辑 /etc/security/limits.conf 以允许该用户访问比通常允许的更多的内存。下面的示例让用户 fooservice 使用 2GB。

fooservice      hard    memlock   2097152
于 2013-04-26T12:59:45.540 回答