如何在Erlang中处理内存不足?

L̲̳*_*̲̳̳ 10 erlang fault-tolerance out-of-memory

有了Erlang的"让它崩溃"的理念,如果一个进程无法分配进行其操作所需的内存,人们就会期望整个VM不会崩溃.实际上,如果系统有一个启发式来杀死一些进程来释放一些内存,那么其他一些进程就会处理这个并恢复.根管理员可能不太可能被启发式杀死.

这与大多数现代流行语言形成鲜明对比,这些语言只会死或让操作系统选择做什么.

如何在Erlang中实际处理内存不足?

Hyn*_*dil 11

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

如果需要容错系统,则必须具有多台计算机.您不能只使用一台计算机(精确的自主计算单元)来构建容错系统.因此,如果您的应用程序在内存不足的情况下运行,最简单的事情就是让整个VM崩溃.无论如何,您的系统中存在错误.

处理所有边缘情况 - 您可以处理的内存不足以及哪些不可以 - 太复杂且容易出错.杀死违规流程不是解决方案.首先,这是一个令人讨厌的过程很难决定.杀死一些"随机"(启发式决定)过程既不是解决方案,因为启发式杀死的这个过程可能是负责意外恢复的过程.杀死整个虚拟机不仅是内存不足的最简单,也是唯一合理的解决方案.

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

  • 你_can_使用一台机器制作一个容错系统,你容忍的错误是你使用的其他人的代码中的错误.事实上,如果在这种意义上它不具有容错能力,那么Linux将无法工作.因此,如果我的流程将一些数据的样本随时间发送给用户(例如完成一个工作单元需要多长时间)有一个错误并分配太多内存,那么我的整个系统应该被视为已损坏并且已关闭?我不认为这个过程对我的系统至关重要,所以我不想依赖它的正确性.如何在Erlang中实际处理OOM*? (2认同)