Semelhante a esta questão , temos uma conta de computação servidor com 96 GB de RAM que é usado para executar trabalhos grandes em paralelo.
Ocasionalmente, a quantidade total de RAM física é excedida, o que faz com que o servidor pare de responder, forçando uma reinicialização. Para mim, isso não é um comportamento aceitável, então estou procurando maneiras de corrigir isso.
Sei que uma maneira seria definir limites usando "ulimit -v". No entanto, eu gostaria de evitar seguir esse caminho, se possível, pois ocasionalmente posso ter um processo muito grande (ao contrário de muitos pequenos), então definir um limite útil será difícil.
Eu suspeito que o problema pode vir do fato de que o sistema tem 20GB de troca: em vez de matar o (s) processo (s) ofensivo (s), o sistema irá alocar memória no disco, o que o tornará irresponsivo. Reduzir a quantidade de troca é uma boa ideia?
Qualquer percepção ou experiências com um problema semelhante altamente apreciado!
EDITAR
Eu fiz alguns experimentos usando o seguinte programa C ++ vazando:
#include <vector>
#include <unistd.h>
using namespace std;
int main(int argc,char * argv[])
{
while(true) {
vector<double>* a = new vector<double>(50000000);
sleep(1);
}
}
Eu corri pela primeira vez com um arquivo de swap de 256MB. O sistema ficou completamente pendurado por cerca de 5 minutos, do que voltou à vida. Nos logs, vi que o assassino da OOM havia matado com sucesso meu programa que vazou.
Eu corri uma segunda vez sem troca. Desta vez, a máquina não voltou a funcionar por pelo menos dez minutos, quando reiniciei a máquina. Isso foi uma surpresa para mim, como eu esperava que o assassino da OOM acesse antes em uma máquina sem swap.
O que eu não entendo é o seguinte: por que o Linux espera até que o sistema esteja completamente travado para fazer algo sobre o processo ofensivo? É demais esperar que um sistema operacional não seja completamente eliminado por um processo mal codificado?