Impedir que o Ubuntu congele, mesmo se a memória do sistema estiver baixa

24

Às vezes, trabalho com grandes quantidades de dados que quero manter na memória para processamento. Às vezes, calculo mal a quantidade de memória que meu programa produzirá ou um depurador multiplica o uso de memória por um fator que excede minha memória disponível.

Sempre que inicio um processo que consome muita memória, é o que eu esperaria de um sistema operacional sadio: tente consumir toda a memória livre e peça a outros processos não essenciais que renunciem à memória de que não precisam; escreva para trocar.

Aqui está o que o Ubuntu faz por mim: coma toda a memória livre, peça ao sistema operacional que troque todos os serviços essenciais (sessão gnome, terminal, teclado), congele e espere que eu puxe o plugue.

Duas questões:

  1. Como um sistema operacional pode assumir que algo pode ser tão importante que não há problema em parar de ouvir as informações do usuário?
  2. Como posso dizer ao Ubuntu para nunca trocar serviços essenciais e sempre reagir à entrada do usuário, mesmo que algum processo estúpido tente consumir mais recursos do que o sistema fornece.
Klamann
fonte
Quanta RAM você instalou? Qual o tamanho do seu swap (no terminal, digite swaponpara descobrir)? Cheers, Al
heynnema 01/09/16
3
16GB de RAM e 16GB de swap. Mas esse não é o ponto aqui, esse problema não pode ser resolvido adicionando mais memória.
Klamann 5/09/16
1
Tente uma de duas coisas. 1) altere a swappinessconfiguração para 10, ou seja: vm.swappiness = 10em /etc/sysctl.conf. Pesquise aqui swappiness para obter mais informações sobre ele. 2) Se a troca não ajudar ... Mesmo que você não queira ... aumente o tamanho do seu arquivo de troca para 1,5x16G e veja se isso ajuda. Mantenha-me informado. Cheers, Al
heynnema
1
@ Klamann Concordo que adicionar mais trocas não resolverá o problema. Depois de ter um programa quebrado, consumindo toda a RAM + SWAP, adicionar SWAP extra atrasa o inevitável.
WinEunuuchs2Unix 5/09/16
1
@ WinEunuuchs2Unix, como eu disse, vm.swappiness=10precisa ser ADICIONADO ao sysctl.conf. Uma pessoa experiente pode até usar o comando sysctl em tempo real, para definir vm.swappiness = 10, sem editar o arquivo sysctl.conf. Saúde, esperamos que o OP responda.
heynnema

Respostas:

5

Ainda não tenho uma solução para o problema, mas posso oferecer duas soluções alternativas que podem ser do interesse de outras pessoas:

1) earlyoom

Esse é um serviço que observa o uso da memória e mata o processo que consome mais memória quando um certo limite é atingido (consulte também esta e esta pergunta sobre o assassino de OOM no kernel do linux)

Testei-o com um processo de demonstração que solicita indefinidamente memória em pequenos pedaços. Aqui está minha primeira impressão: quando inicio o processo não autorizado, ele consome rapidamente toda a minha RAM. Em seguida, a troca começa e o sistema fica sem resposta. Alguns segundos depois, o sistema está novamente online. O log do earlyoom mostra que eliminou o processo de consumo de memória após o uso de memória e troca atingir 90%.

Ainda existe um atraso irritante quando a troca é iniciada e após a interrupção do processo, algumas partes de outros processos geralmente permanecem em troca até serem solicitadas, mas é um começo.

2) basta desativar a troca

Sei que esse é um tópico polêmico , mas, para o propósito de sistemas de desktop e, especialmente, de máquinas de desenvolvimento, nas quais, de tempos em tempos, um processo tenta consumir toda a memória, faz sentido: sem troca, o assassino do OOM simplesmente funciona como pretendido. Quando você fica sem memória, ele encontra o melhor processo para matar e se livra dele. Sem atraso, sem atraso.

Você pode desativar a troca da sessão atual sudo swapoff -aou tornar a alteração permanente .


A solução adequada para o problema seria, obviamente, que o sistema permaneça responsivo quando a memória principal se esgote e comece a trocar a memória como se não houvesse amanhã, mas isso não parece estar acontecendo tão cedo.

Klamann
fonte
1
Desativei o swap e meu sistema passa diretamente da memória baixa (<100 MB) para o congelamento. Como posso saber se o killer do OOM está realmente ativado?
Michael
0

Tente uma de duas coisas:

1) altere a configuração de swappiness da configuração padrão de 60 para 10, ou seja: adicione vm.swappiness = 10 ao /etc/sysctl.conf (no terminal, tipo sudo gedit /etc/sysctl.conf) e reinicie o sistema. Pesquise aqui swappiness para obter mais informações sobre ele.

2) Se a troca não ajudar ... mesmo que você não queira ... aumente o tamanho do seu arquivo de troca para 1,5x16G e veja se isso ajuda.

Mantenha-me informado. Cheers, Al

heynnema
fonte
Eu configurei uma VM para executar alguns testes, porque a reinicialização do meu sistema operacional a cada poucos segundos era realmente irritante. Ubuntu 16.04, 2gb ram, 3gb swap, 20gb disco. Depois, executei um script que consome muita memória: com a troca padrão (60), o sistema congela e, após alguns minutos, eu o desligo porque o tempo de recuperação era inaceitável. Com o swappiness 10, o sistema congela por alguns segundos e aceita entrada, mas você não pode iniciar nenhum processo (por exemplo, toppara eliminar o problema da memória). Depois de um minuto ou mais, o processo é interrompido. Não é perfeito, mas estamos nos aproximando.
Klamann
Mantenha-nos informados. A VM não emulará verdadeiramente o seu sistema operacional de trabalho da vida real, mas permitirá que você jogue com as configurações. Ficarei curioso para saber se a troca ajuda com o seu problema. Cheers, Al
heynnema
Ah bom. Progresso! Leia um pouco sobre swappiness. Você pode jogar um pouco com o valor. Cheers, Al
heynnema
Quanta troca estava sendo usada quando o sistema congelou? Cheers, Al
heynnema
2
por que, qual é o sentido disso? mais memória não impedirá que o sistema fique travado se eu sugar essa memória também.
Klamann
0

Eu resolvi um problema semelhante. Não sei se minha experiência talvez seja adequada para você ...

Recentemente, publiquei um guia sobre como instalar o Linux em dispositivos LVM de loopback inicializando a partir do USB (portanto, sem precisar instalar o grub no disco interno, deixando-o como original). Aqui está o guia: https://github.com/DareDevil73/linux-on-loopback-usb .

Então caí no problema de congelamento com alta carga de memória e observei um uso anormal do espaço de troca (toda a RAM consumida e uso de troca próximo de zero). Obviamente, a partição de troca LVM foi montada e funcionando corretamente, mas não sei por que o kernel não a usou como esperado.

Eu tentei uma solução alternativa. Eu criei um arquivo de loopback de troca (não o LVM) e o congelamento se foi. Agora, o arquivo de troca é usado como seria e o sistema operacional nunca congela!

Consulte https://github.com/DareDevil73/linux-on-loopback-usb#known-issues para obter informações mais detalhadas.

Antonio Petricca
fonte
Por favor, expanda os links em respostas.
Konrad Gajewski