Soluções de limitação de memória para aplicativos gananciosos que podem travar o SO?

32

Eu uso meu computador para programação científica. Ele possui uma boa 8GBRAM e 12GBespaço de troca. Freqüentemente, à medida que meus problemas aumentam, excedo toda a RAM disponível. Em vez de travar (o que seria preferido), parece que o Ubuntu começa a carregar tudo no swap, incluindo o Unity e quaisquer terminais abertos. Se eu não pegar um programa fugitivo 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-F2onde eu posso matar o processo ofensivo.

Como minha própria estupidez está fora do escopo deste fórum, como posso evitar que o Ubuntu falhe através do thrashing quando uso toda a memória disponível de um único programa ofensivo?

Experiência em casa *!

Abra um terminal, inicie pythone, se você tiver numpyinstalado, tente o seguinte:

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

* Aviso: pode ter efeitos adversos, monitorar o processo via iotopou topeliminá-lo a tempo. Caso contrário, vejo você após a reinicialização.

Hooked
fonte

Respostas:

21

O shell interno ulimitpermite 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 (100000 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

É observado ps uww -C script-name-hereque o python requer pelo menos 29 MB de memória (coluna VSZ). O limite do RSS aumenta à medida que o script python precisa de mais memória, para adaptar essa coluna.

Lekensteyn
fonte
1
Pena que não sabemos como é o aplicativo real. O ulimit, conforme demonstrado, afeta todos os processos que são filhos desse shell. Nem sabemos se ele é executado como um daemon ou se há muitos filhos, o que complicaria ainda mais as coisas. Veja coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki
1
Não existe um front end amigável ao ulimit e cgroups ? No Windows, quando o sistema operacional fica quase sem memória RAM, um pop-up de aviso sempre me permite evitar congelamentos do sistema. No Ubuntu, eu tenho que ficar de olho no uso da memória o tempo todo?
Dan Dascalescu
1
@DanDascalescu Se você tiver um arquivo de troca configurado, sofrerá atrasos mais longos, mas ainda poderá trabalhar. Depois de perceber que a troca é iniciada, você pode verificar o monitor do sistema quanto ao uso de RAM. Se o sistema realmente ficar sem memória, o killer de falta de memória (OOM) é chamado, o que mata um processo com a maior pontuação de "badness" (geralmente o processo que consome mais memória).
Lekensteyn 14/01
12

Os Cgroups devem permitir que você limite o uso da memória por processo.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

A computação científica é notoriamente intensiva em memória; ao colocar o aplicativo em um grupo de proteção em sandbox, o restante dos processos não deve ser vítima, pois a pressão da memória será aliviada.

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

Decisões decisões :) Boa sorte!

ppetraki
fonte
1
Não existe um front end amigável ao ulimit e cgroups? No Windows, quando o sistema operacional fica quase sem RAM, um pop-up de aviso sempre me permite evitar congelamentos do sistema. No Ubuntu, eu tenho que ficar de olho no uso da memória o tempo todo?
Dan Dascalescu
Não. Além disso, seu sistema operacional também não deve estar congelando, isso é um problema separado. As janelas pop-up são apenas uma bandaid para começar. Se você estiver usando toneladas de memória, talvez devesse investigar por quê? Por exemplo, navegadores modernos com sanbox podem consumir facilmente 70-150M POR TAB. Desativá-lo ou ajustá-lo pode liberar memória substancial usada regularmente por um usuário final. Os agendadores devem trocar os programas raramente usados ​​para economizar espaço, mas se eles acordarem mais do que deveriam, será necessário corrigi-los ou se sua tarefa principal exigir muita memória (web), mais memória RAM será necessária.
ppetraki
8
Eu sei o que consome a memória - Chrome. Mas o sistema operacional deve proteger sua estabilidade contra aplicativos que ficam sem graça.
Dan Dascalescu
1
Entendo de onde você é como usuário. O que você está pedindo, no entanto, significa transformar uma plataforma de computação geral em um dispositivo. Como o método menos complexo (propenso a erros) que um engenheiro de sistema operacional deve implementar para fornecer essas salvaguardas é tomar decisões dramaticamente opinativas sobre como o computador inteiro é executado. Isso geralmente ocorre às custas da flexibilidade do usuário final. Você vê exemplos disso na computação em tablets. Nos desktops, no entanto, a flexibilidade é preservada.
ppetraki