如果内存和交换耗尽,进程是否会自动终止?

时间:2017-07-25 08:33:10

标签: ubuntu memory virtual-machine swap kill-process

我有一台Ubuntu 16.04虚拟机,用于高度计算昂贵的作业,这些作业在机器32核上并行运行(每个核1个,由GNU并行分配)。 在几小时到几天的运行时间之后,我注意到一些核心被释放并且相应的进程不再运行。根据{{​​1}},内存(~100GB)和交换(~1GB)几乎完全满了。但是,单独一个进程通常需要多个GB。

发生什么事了?一旦有更多可用内存,那些未主动运行的进程是否会被换出并在以后继续?或者他们刚被杀,因为交换已经满了?

我宁愿手动停止进程并检索中间结果,而不是让进程被杀死并在计算几天后丢失任何结果。 在作业运行时我无法增加内存,但我刚遇到swapspace。在进程仍在运行时安装它是否有意义;希望自动增加交换空间并防止进程被杀?

1 个答案:

答案 0 :(得分:1)

默认情况下,Linux将为进程提供比系统中实际可用内存更多的内存(memory overcommitment)。许多内存分配(例如堆栈或malloc堆竞技场)永远不会被完全使用,因此这允许系统在不遇到内存分配失败的情况下完成更多工作。

但是,如果进程写入分配给它们的所有内存,那么内核就无法兑现这个承诺。没有办法向进程返回错误,因为它只是一个写指令,所以内核必须杀死进程。有一些启发式方法可以选择一个对系统并不重要的过程,但却释放了大量的RAM,但这并不总能产生良好的结果。

在您的情况下,您可能应该使用vm.overcommit_memory=2配置系统。这将禁用内存过量使用,内核只会分发实际由物理内存(RAM或交换)支持的内存。