Erlang中如何处理内存耗尽?

11

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

这与大多数现代流行语言形成鲜明对比,后者只是死亡或让操作系统选择如何处理。

那么在Erlang中,内存耗尽时实际上是如何处理的呢?


1个回答

12

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

如果您想要一个容错系统,那么您必须已经有多台计算机。只有一个计算机(自主计算单元)无法创建容错系统。因此,如果您的应用程序在内存不足的情况下运行,则最简单的方法是让整个VM崩溃。反正你的系统中存在错误。

处理所有边缘情况——您可以处理哪些内存不足,哪些不能处理——太复杂且容易出错。杀死有问题的进程也不是解决方法。首先,很难确定哪个进程有问题。随机杀死某个(根据启发式决定的)进程也不是解决方案,因为可能导致被启发式杀死的进程恰好是负责恢复的进程。让整个VM崩溃不仅是最简单,而且是唯一合理的内存不足解决方案。

在大多数现代流行语言或操作系统中的处理方式在需要可靠系统的情况下绝对是错误的。这可能对桌面或要求不那么严格的系统可以接受,但对Erlang设计的系统绝对不可接受。


如果由于冗余应用程序导致两台计算机上的虚拟机都耗尽内存,怎么办? - Muzaaya Joshua
@MuzaayaJoshua:我认为您混淆了高可靠性和高可用性。这两者都是容错解决方案。高可用性的解决方案必须无间断地工作。高可靠性的解决方案必须正常地工作,即没有错误,但可能会意外停止。冗余应用程序用于创建高可靠性解决方案。备份应用程序用于从备份中制作高可用性解决方案。这意味着准备了“冗余”应用程序,该应用程序不运行应用程序,而只更新其状态。备份应用程序不应遇到与主要应用相同的oom情况。无论如何,在这两种情况下都有崩溃的可能。 - Hynek -Pichi- Vychodil
2
你可以使用一台机器制作一个容错系统,你所容忍的故障是其他人编写的代码中的错误。事实上,如果Linux在这个意义上不具备容错性,它将永远无法正常工作。因此,如果我的进程定期向用户发送某些数据样本(例如完成一项工作所需的时间),并且存在一个bug导致分配了过多的内存,那么整个系统应该被视为已经崩溃了吗?我不认为这样的进程对我的系统至关重要,因此我不想依赖其正确性。Erlang如何*实际处理OOM问题? - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
1
这只是有限的容错能力,如果一台机器出现问题,整个系统也会崩溃。要实现真正的容错能力,您需要多台机器。 - rvirding
哎呀,好吧,如果您编辑您的答案并明确指出Erlang会这样做,那么我会接受您的答案。现在看起来您只是建议我的程序应该这样做(我无法确定它是否意味着我应该配置我的程序以在发生OOM时崩溃,还是Erlang VM已经这样做了)。 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接