O Ubuntu está ficando sem RAM rapidamente, e meu computador está começando a congelar. Qual comando vai resolver isso?

72

Isso acontece com muita frequência quando estou compilando software em segundo plano e de repente tudo começa a ficar lento e, eventualmente, congelar [se eu não fizer nada], já que fiquei sem memória RAM e troquei espaço.

Esta questão assume que eu tenho tempo e recursos suficientes para abrir o Terminal Gnome, pesquisar através do meu histórico e executar um comando sudo .

Qual comando pode me salvar de ter que fazer uma reinicialização ou alguma reinicialização?

    
por Akiva 03.07.2017 / 11:15

11 respostas

84

Na minha experiência, o Firefox e o Chrome usam mais RAM do que meus primeiros 7 computadores combinados. Provavelmente mais do que isso, mas estou me afastando do meu ponto. A primeira coisa que você deve fazer é fechar seu navegador . Um comando?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

Eu amarrei os navegadores mais populares juntos em um comando lá, mas, obviamente, se você está executando outra coisa (ou sei que você não está usando um deles) basta modificar o comando. O killall -9 ... é o bit importante. As pessoas ficam duvidosas sobre SIGKILL (número de sinal 9), mas os navegadores são extremamente resilientes. Mais do que isso, terminar lentamente via SIGTERM significará que o navegador faz uma carga de lixo de limpeza - o que requer uma explosão de RAM adicional - e isso é algo que você não pode pagar nessa situação.

Se você não conseguir isso em um terminal já em execução ou em um diálogo Alt + F2 , considere mudar para um TTY. Controle + Alt + F2 leva você ao TTY2, que deve permitir o login (embora seja lento) e deve permitir que você use algo como htop para depurar o problema. Eu acho que nunca fiquei sem RAM a ponto de não conseguir htop .

A solução de longo prazo envolve comprar mais RAM, alugá-la por meio de um computador remoto ou não fazer o que você está fazendo atualmente. Vou deixar os intricados argumentos econômicos até você, mas, em geral, a RAM é barata de comprar, mas se você precisar apenas de uma quantidade de estouro, um servidor VPS cobrado por minuto, ou hora, é uma ótima escolha.

    
por Oli 03.07.2017 / 11:30
66

Em um sistema com a Magic System Request Key habilitada, pressionando Alt + Solicitação do Sistema + f (se não estiver marcada no seu teclado, A requisição do sistema geralmente está na tecla Print Screen invocará manualmente o killer da memória do kernel (oomkiller), que tenta escolher o pior processo para uso da memória e matar isto. Você pode fazer isso se você tiver menos tempo do que você descreveu e o sistema está prestes a começar (ou talvez já tenha começado) se debatendo - nesse caso você provavelmente não se importa exatamente com o que é morto, só que você termina com um sistema utilizável. Às vezes, isso pode acabar matando X, mas na maioria das vezes, hoje em dia, é muito melhor escolher um processo ruim do que costumava ser.

    
por Muzer 03.07.2017 / 12:44
20

Ao contrário de outras respostas, sugiro que você desative o swap enquanto estiver fazendo isso. Enquanto o swap mantém seu sistema rodando de uma maneira previsível, e é freqüentemente usado para aumentar a taxa de transferência de aplicativos acessando o disco (removendo páginas não usadas para permitir espaço para o cache de disco), neste caso parece que seu sistema está sendo desacelerado a níveis inutilizáveis, porque a memória ativamente usada em excesso está sendo forçada a ser despejada para troca.

Eu recomendaria desabilitar a troca por completo ao fazer essa tarefa, para que o assassino de falta de memória atue assim que a RAM for preenchida.

Soluções alternativas:

  • Aumenta a velocidade de leitura da troca colocando sua partição de swap em RAID1
    • Ou RAID0 se você estiver se sentindo arriscado, mas isso reduzirá um grande número de programas em execução se algum dos seus discos falhar.
  • Diminuir o número de trabalhos de criação simultâneos ("mais núcleos = mais velocidade", todos dizemos, esquecendo que isso causa um impacto linear na RAM)
  • Isso pode acontecer nos dois sentidos, mas tente ativar zswap no kernel. Isso comprime as páginas antes que elas sejam enviadas para a troca, o que pode fornecer espaço de manobra suficiente para acelerar sua máquina. Por outro lado, pode acabar sendo um obstáculo com a compressão / descompressão extra que faz.
  • Diminua as otimizações ou use um compilador diferente. A otimização do código às vezes pode ocupar vários gigabytes de memória. Se você tiver LTO ligado, você vai usar muita memória RAM no estágio de link também. Se tudo isso falhar, você pode tentar compilar seu projeto com um compilador mais leve (por exemplo, tcc ), às custas de um pequeno impacto no desempenho em tempo de execução do produto compilado. (Isso geralmente é aceitável se você estiver fazendo isso para fins de desenvolvimento / depuração).
por Score_Under 03.07.2017 / 19:47
14

Você pode usar o seguinte comando (repetidamente, se necessário) para eliminar o processo usando a maior parte da RAM do seu sistema:

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

Com:

  • ps -eo pid --no-headers --sort=-%mem : exibe os ids do processo de todos os processos em execução, classificados por uso de memória
  • head -1 : mantenha apenas a primeira linha (processo usando mais memória)
  • xargs kill -9 : mata o processo

Edite após o comentário exato de Dmitry:

Esta é uma solução rápida e suja que deve ser executada quando não há tarefas sensíveis em execução (tarefas que você não deseja kill -9 ).

    
por Gohu 03.07.2017 / 17:12
11

Antes de executar os comandos que consomem recursos, você também pode usar o setrlimit (2) chamada de sistema, provavelmente com o ulimit incorporado ao seu shell bash ( ou o limit embutido em zsh) notavelmente com -v para RLIMIT_AS . Então consumo de espaço de endereço virtual muito grande (por exemplo, com mmap (2) ou sbrk (2) usado por malloc (3) ) irá falhar (com errno (3) sendo ENOMEM ).

Em seguida, eles (ou seja, os processos com fome no seu shell, depois que você digitou ulimit ) seriam encerrados antes de congelar o sistema.

Leia também Linux Ate My RAM e considere desativar overcommitment de memória (executando o comando echo 0 > /proc/sys/vm/overcommit_memory as root, veja proc (5) ...).

    
por Basile Starynkevitch 04.07.2017 / 07:42
11
% bl0ck_qu0te%

Nesse caso, algo como "killall -9 make" (ou o que você estiver usando para gerenciar sua compilação, se não for). Isso irá parar a compilação prosseguir, SIGHUP todos os processos de compilador lançados a partir dele (esperançosamente fazendo com que eles parem também) e, como um bônus, não precisa sudo assumindo que você está compilando como o mesmo usuário que você está logado em como. E como ele elimina a causa real do seu problema em vez do seu navegador da Web, sessão X ou algum processo aleatoriamente, ele não interferirá no que quer que você esteja fazendo no sistema no momento.

    
por fluffysheap 05.07.2017 / 09:34
9

Crie mais algumas trocas por si mesmo.

O seguinte irá adicionar 8G de swap:

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

Ainda vai ser lento (você está trocando), mas você não deve realmente acabar. Versões modernas do Linux podem trocar por arquivos. Sobre o único uso para uma partição swap nos dias de hoje é para hibernar seu laptop.

    
por William Hay 03.07.2017 / 16:35
4

Uma maneira de obter um pouco de RAM livre em um curto prazo é usar zram , que cria um disco RAM compactado e troca lá. Com qualquer CPU meio decente, isso é muito mais rápido do que o swap normal, e as taxas de compressão são muito altas, com muitos usuários modernos de RAM, como navegadores da Web.

Supondo que você tenha o zram instalado e configurado, tudo que você precisa fazer é executar

sudo service zramswap start
    
por Dmitry Grigoryev 04.07.2017 / 15:01
3

Outra coisa que você pode fazer é liberar o cache de páginas de memória através deste comando:

echo 3 | sudo tee /proc/sys/vm/drop_caches

De documentação do kernel.org (ênfase adicionada):

% bl0ck_qu0te%     
por Sergiy Kolodyazhnyy 03.07.2017 / 17:13
2

sudo swapoff -a desativará a troca, fazendo com que o kernel mate automaticamente o processo com o maior pontuação se o sistema ficar sem memória. Eu uso isso se eu sei que vou estar executando algo pesado em RAM que eu prefiro matar se sair do controle do que deixá-lo entrar em swap e ficar preso para sempre. Use sudo swapon -a para reativá-lo depois.

Mais tarde, você pode querer dar uma olhada nas suas configurações de troca. Parece que sua troca está no mesmo disco que a partição raiz, o que desaceleraria seu sistema quando você clicasse em swap, então evite isso se puder. Além disso, na minha opinião, sistemas modernos geralmente são configurados com muita troca. 32GiB RAM normalmente significa que 32GiB swap é alocado por padrão, como se você realmente quisesse colocar 32GiB no seu espaço de troca.

    
por sudo 07.07.2017 / 19:02
1

Você disse "compilando em segundo plano". O que você está fazendo em primeiro plano? Se você está desenvolvendo com o Eclipse ou outro IDE pesado de recursos, verifique se tudo está finalizado corretamente no console.

Ambientes de desenvolvimento geralmente permitem iniciar vários processos em desenvolvimento, eles podem ficar suspensos também depois que você não estiver mais interessado neles (no depurador, ou apenas não finalizado corretamente). Se o desenvolvedor não prestar atenção, dezenas de processos esquecidos podem se acumular durante o dia, usando vários gigabytes juntos.

Verifique se tudo o que deve ser terminado no IDE é finalizado.

    
por h22 08.07.2017 / 10:00