【发布时间】:2012-10-14 08:49:52
【问题描述】:
我一直在功能强大的服务器上运行 erlang 应用程序。但是,有时,您无法避免此类内存错误,尤其是当用户很多时
崩溃转储被写入:erl_crash.dump eheap_alloc:无法分配 467078560 字节的内存(“堆”类型)。 更烦人的是你有一个 20GB 内存的服务器,比如 8 个内核。查看 erlang 所说的内存,它无法分配,这就是它崩溃的原因,这也令人不安,因为与服务器的库存相比,它的内存非常少。我今天的问题(我希望它没有关闭),是什么操作系统配置可以完成(考虑 RedHat、Solaris、Ubuntu 或 Linux),以使其在需要时为 erlang VM 提供更多内存?
如果要在此类功能强大的服务器上运行 erlang 应用程序,对于底层操作系统,应该考虑哪些内存考虑(在 erlang 之外)?
问题背景
Erlang 消耗主内存,尤其是当进程数以千计时。我正在使用
Yaws Web Server 运行Web 服务。在同一个节点上,我让 Mnesia 运行大约 3 个ram_copies 表。它是一个通知系统,作为运行在 Intranet 上的大型 Web 应用程序的一部分。用户通过 JSONP 从运行在不同 Web 服务器和不同硬件上的主应用程序访问这个系统。每个用户连接都直接向 mnesia 查询它需要的任何数据。然而,随着用户的增加,我总是得到crash dump。我尽可能地调整了应用程序本身,将代码清理为标准,使用的二进制文件多于字符串等。在 yaws 进程和 mnesia 之间避免了像 gen_servers 这样的单点,以便每个连接直接命中 mnesia。该服务器功能强大,具有大量 RAM 和磁盘空间。但是,当我的节点需要更多内存时会崩溃,这就是为什么我需要找到一种方法来强制操作系统将更多内存扩展到 erlang。操作系统是REDHAT ENTERPRISE 6
【问题讨论】:
-
Erlang VM 崩溃时使用了多少内存?有多少可用 RAM 和交换空间?
-
swap 是 8GB 和可用内存,大约 17 GB。使用 Erlang,操作系统和其他一些例程使用 2.5 GB 来弥补 20 GB
-
你运行的是什么 Erlang VM? 32 位、64 位还是半字?
-
64 位操作系统上的 32 位
-
你有使用 32 位 Erlang 的特定理由吗?您可以在大多数(全部?)支持的 64 位平台上将 Erlang 构建为 64 位进程(或通过包管理器部署相同的进程)。
标签: linux unix memory erlang mnesia