【问题标题】:How is running out of memory handled in Erlang?Erlang如何处理内存不足的问题?
【发布时间】:2012-06-22 03:48:59
【问题描述】:

根据 Erlang 的“让它崩溃”的理念,如果一个进程无法分配继续其操作所需的内存,人们会期望整个 VM 不会崩溃;事实上,如果系统有一个启发式方法来杀死某个进程以释放一些内存,那么其他一些进程会处理这个并恢复。根监督者可能不太可能被启发式方法杀死。

这与大多数现代流行语言形成鲜明对比,后者只是死掉或让操作系统选择做什么。

Erlang 中实际上是如何处理内存不足的?

【问题讨论】:

标签: erlang out-of-memory fault-tolerance


【解决方案1】:

当 Erlang VM 在内存不足的情况下运行时,它只会使整个 VM 崩溃。原因是这是最简单、最安全的做法。

如果您想要一个容错系统,您必须已经拥有多台计算机。您无法仅使用一台计算机(精确的自治计算单元)来构建容错系统。因此,如果您的应用程序在内存不足的情况下运行,最简单的方法就是让整个 VM 崩溃。无论如何,您的系统中存在错误。

处理所有边缘情况(您可以处理哪些内存不足,哪些不能处理)太复杂且容易出错。杀死有问题的进程不是解决方案。首先,哪个是违规过程很难决定。杀死一些“随机”(启发式决定的)进程也不是一个解决方案,因为这个被启发式杀死的进程可能是负责意外恢复的进程。杀死整个 VM 不仅是解决内存不足情况的最简单而且唯一合理的解决方案。

在您需要可靠系统的情况下,大多数现代流行语言或操作系统的执行方式肯定是错误的。它对于桌面或不太严格的要求是可以接受的,但对于 Erlang 设计的系统绝对不能接受。

【讨论】:

  • 如果两台计算机上的两个虚拟机由于冗余应用程序而耗尽内存怎么办?
  • Muzaaya,“冗余应用程序”是什么意思?
  • @MuzaayaJoshua:它认为你在搞乱高可靠性和高可用性。这两者都是容错解决方案。高可用的必须不停地工作。高可靠的必须正常工作,即没有错误但可能会意外停止。冗余应用程序用于制作高可靠性应用程序。高可用的用于从备份中获得。这意味着有准备好的“冗余”应用程序不运行应用程序,而只是更新它的状态。备份应用程序不应作为主要应用程序遇到 oom 情况。无论如何,崩溃在这两种情况下都是正确的。
  • 可以用一台机器制作一个容错系统,你容忍的错误是你使用的其他人的代码中的错误。事实上,如果 Linux 在这个意义上不能容错,它就永远无法工作。因此,如果我的进程随着时间的推移向用户发送一些数据样本(例如完成一个工作单元需要多长时间)存在错误并分配了过多的内存,那么我的整个系统应该被视为损坏并出现故障?我不认为这样的过程对我的系统至关重要,所以我不想依赖它的正确性。 Erlang中实际是如何处理OOM的?
  • 这只是有限的容错能力,就好像一台机器宕机一样,系统也会宕机。要获得真正的容错,您确实需要多台机器。
猜你喜欢
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多