Soluções limitadoras de memória para aplicativos gulosos que podem travar o sistema operacional?

28

Eu uso meu computador para programação científica. Ele possui 8GB de RAM e 12GB de espaço de troca. Muitas vezes, à medida que meus problemas se tornam maiores, excedido toda a RAM disponível. Em vez de travar (o que seria preferido), parece que o Ubuntu começa a carregar tudo em swap, incluindo o Unity e qualquer terminal aberto. Se eu não pegar um programa de fuga a tempo, não há nada que eu possa fazer além de esperar - leva 4-5 minutos para mudar para um prompt de comando, por exemplo. Ctrl-Alt-F2 onde eu posso matar o processo ofensivo.

Como minha própria estupidez está fora do escopo deste fórum, como posso evitar que o Ubuntu travar por meio de thrashing quando uso toda a memória disponível de um único programa problemático?

Experiência em casa *!

Abra um terminal, inicie o python e, se tiver o numpy instalado, tente o seguinte:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Aviso: pode ter efeitos adversos, monitorar o processo via iotop ou top para matá-lo a tempo. Se não, eu vejo você depois da sua reinicialização.

    
por Hooked 10.04.2012 / 18:11

2 respostas

17

O shell ulimit permite restringir recursos. Para o seu caso, para limitar o uso de memória no shell (e seus filhos), use ulimit -v .

Demonstração definindo um limite de memória de 100 MB (100.000 KB):

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Observou-se usando ps uww -C script-name-here que python requer pelo menos 29MB de memória (coluna VSZ). O limite de RSS aumenta à medida que o seu script python precisa de mais memória, portanto, adapte essa coluna.

    
por Lekensteyn 10.04.2012 / 18:39
12

Os Cgroups devem permitir limitar o uso da memória por processo.

link

link

Computação científica é notoriamente intensiva em memória, por sandboxing seu aplicativo em um cgroup, o restante dos processos não deve se tornar vítimas como pressão de memória será aliviada.

Como alternativa, uma VM pode ser usada como uma espécie de limite rígido, como o aplicativo só pode usar a memória delegada para a máquina virtual, às custas de desempenho de curso. No entanto, uma VM é muito mais fácil de configurar para os não iniciados quando comparados ao estabelecimento e manutenção de um cgroup.

Decisões decisões :) Boa sorte!

    
por ppetraki 10.04.2012 / 18:20