Todos nós já experimentamos - é solicitado a algum programa que faça algo que exija uma quantidade enorme de memória. Ele obedientemente tenta alocar toda essa memória, e o sistema imediatamente começa a se debater, trocando sem parar e ficando lento ou sem resposta.
Mais recentemente, experimentei isso no meu laptop Ubuntu devido a um script do Matlab tentando alocar uma matriz ridiculamente grande. Depois de mais de 5 minutos de debatida, consegui fazer o Ctrl-F1 em um console e matar o Matlab. Eu preferiria ter alguma tecla de atalho que me desse o controle do sistema imediatamente e me permitisse matar o processo ofensivo; ou, talvez, simplesmente se recuse silenciosamente a alocar um buffer tão grande.
Qual é a maneira mais rápida de recuperar o controle de um sistema Linux que não responde ou é extremamente lento devido à troca excessiva?
Existe uma maneira eficaz de impedir que essa troca ocorra em primeiro lugar, por exemplo, limitando a quantidade de memória que um processo pode tentar alocar?
Já respondeu acima com Alt-SysRq-F
Estou respondendo a esta 2ª parte. Sim,
ulimit
ainda funciona bem o suficiente para limitar um único processo. Você pode:Além disso, como mencionado brevemente:
De fato, o cgroups oferece controle mais avançado, mas atualmente é mais complicado de configurar na minha opinião.
Ulimit da velha escola
Uma vez desligado
Aqui está um exemplo simples:
Isto:
r2(){ r2 $@$@;};r2 r2
que exponencialmente consumirá CPU e RAM, dobrando-se infinitamente enquanto solicita memória da pilha.Como você pode ver, ele foi interrompido ao tentar solicitar mais de 1 GB.
Observe que
-v
opera na alocação de memória virtual (total, ou seja, físico + swap).Protecção permanente
Para limitar a alocação de memória virtual,
as
é o equivalente a-v
paralimits.conf
.Eu faço o seguinte para proteger contra qualquer processo de comportamento inadequado:
address space limit = <physical memory> - 256MB
.Um forro:
Para validar, isso resulta no seguinte (por exemplo, no sistema de 16 GB):
Notas:
rss
opção em limits.conf. Não é respeitado pelos kernels mais recentes.Grupos CG mais recentes
Oferece mais controle, mas atualmente é mais complexo de usar:
memory.max_usage_in_bytes
pode contabilizar e limitar a memória física separadamente.ulimit -m
e / ourss
inlimits.conf
foi criado para oferecer funcionalidade semelhante, mas isso não funciona desde o kernel Linux 2.4.30!cgroup_enable=memory swapaccount=1
.cgm
agora parece ser a ferramenta de espaço de usuário oficialmente suportada.Por exemplo, para verificar as configurações atuais:
Por exemplo, para limitar a memória de um único processo:
Para vê-lo em ação, mastigando a RAM como um processo em segundo plano e sendo morto:
Observe o crescimento exponencial (potência de 2) nas solicitações de memória.
No futuro, esperamos ver "distro / vendors" pré-configurar prioridades e limites do cgroup (via unidades systemd) para coisas importantes como SSH e a pilha gráfica, para que eles nunca fiquem com falta de memória.
fonte
Você pode pressionar Ctrl- zpara suspender o programa. Você pode fazer
kill %1
(ou qualquer que seja o número do trabalho ou usar o PID).Você pode usar o
ulimit
comando para tentar limitar a quantidade de memória disponível para um processo.fonte
kill -STOP <pid>
que fará o mesmo que Ctrl-Z.Você pode usar o CGroups para limitar o uso de recursos e evitar esses problemas: https://en.wikipedia.org/wiki/Cgroups
fonte
Sempre existe o
xkill
comando clássico (do xorg-x11-apps-7.4-14.fc14.src.rpm no meu sistema). Eu acho que não deve ser muito difícil criar um clone que envie o SIGSTOP em vez de matar a janela de destino.fonte