如果内存和交换 运行 出,进程是否会自动终止?

Are processes killed automatically if memory and swap run out?

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

发生什么事了?一旦有更多可用内存,是否 运行ning 不活跃的进程被换出并稍后继续?或者他们只是因为交换也已满而被杀?

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

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

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

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