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

73

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

Esta pergunta pressupõe que tenho tempo e recursos suficientes para abrir o Gnome Terminal, pesquisar no meu histórico e executar um sudocomando.

Que comando pode me impedir de fazer uma reinicialização completa ou qualquer reinicialização?

Akiva
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Thomas Ward
11
Se você ficar sem espaço de troca, acho que você tem muito pouco. Eu tenho 20G de espaço de troca neste computador. O objetivo é que você tenha tempo suficiente com um sistema utilizável para matar o que estiver consumindo sua memória. Não é algo em que você pega apenas o que vai usar, mas o que você espera que nunca use.
8117 JoL
11
Você tem certeza de que a RAM e a troca estão sendo preenchidas? Se fosse esse o caso, o manipulador OOM mataria seu compilador e liberaria memória (e também estragaria seu processo de compilação). Caso contrário, eu acho que está ficando cheio e talvez o seu sistema esteja lento porque sua troca está no disco do sistema.
Sudo
3
Tente reduzir o número de compilações paralelas se você não tiver RAM suficiente para suportá-la. Se a sua compilação começar a trocar, você será muito mais lento. Com make, tente, -j4por exemplo, 4 compilações paralelas por vez.
Shahbaz
11
"Alexa pedir me 8 GB de RAM"

Respostas:

84

Na minha experiência, o Firefox e o Chrome usam mais RAM do que os 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 o navegador . Um comando?

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

Amarrei os navegadores mais populares em um comando lá, mas, obviamente, se você estiver executando outra coisa (ou souber que não está usando um deles), apenas modifique o comando. O killall -9 ...é o pouco importante. As pessoas ficam duvidosas quanto ao SIGKILL(sinal número 9), mas os navegadores são extremamente resilientes. Mais do que isso, encerrar lentamente via SIGTERMsignifica que o navegador faz uma grande quantidade 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 colocar isso em um terminal já em execução ou em um diálogo Alt+ F2, considere mudar para um TTY. ControlO + Alt+ F2leva você ao TTY2, que deve permitir o login (embora possa ser lento) e até permitir que você use algo como htoppara depurar o problema. Acho que nunca fiquei sem memória RAM a ponto de não conseguir htoplevantar.

A solução a longo prazo envolve comprar mais RAM, alugá-la através de um computador remoto ou não fazer o que você está fazendo atualmente. Deixarei os intrincados argumentos econômicos para você, mas de um modo geral, a RAM é barata de comprar, mas se você precisar apenas de uma quantidade estourada, um servidor VPS cobrado por minuto ou hora é uma ótima opção.

Oli
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Thomas Ward
Eu tenho alguns comandos vinculados ao meu próprio lazygitcomando que eu uso de tempos em tempos, talvez algo assim possa ser aplicado aqui? O killall ...script inteiro pode ser reduzido a um simples emptyramou algo assim #
Francisco Presencia
Você não precisa executar o comando completo se souber qual navegador está sendo executado e eu presumo que a maioria das pessoas que podem identificar uma falta de RAM o faça. Por extensão, acho mais difícil lembrar que escrevi um emptyramroteiro do que apenas escrever killall -9 firefox.
Oli
2
Comprando RAM ... por que não baixar mais RAM?
Stephan Bijzitter 7/07
11
Bem, você pode brincar, mas se precisar fazer algo por um curto período de tempo e precisar de muito mais RAM e CPU que você possui, alugar um VPS a cada minuto é bastante econômico para uma única tentativa.
Oli
66

Em um sistema com a Chave de Solicitação Mágica do Sistema ativada, pressionar Alt + System Request+ f(se não estiver marcado no teclado, System Requestgeralmente está na Print Screentecla) chamará manualmente o assassino de falta de memória (oomkiller) do kernel, que tenta escolher o pior processo ofensivo para uso de memória e mate-o. Você pode fazer isso se tiver talvez menos tempo do que o descrito e o sistema estiver prestes a começar (ou talvez já tenha começado) a debulhar - nesse caso, você provavelmente não se importa exatamente com o que é morto, apenas com o fim com um sistema utilizável. Às vezes, isso pode acabar matando o X, mas na maioria das vezes hoje em dia é muito melhor escolher um processo ruim do que costumava ser.

Muzer
fonte
5
@ T.Sar Se você estiver indo direto para a surra, você já perde ou tem a chance de matar pessoas que comem memória. Você não ganha nada se apenas se abstém de agir.
Ruslan
4
@Muzer isto só irá funcionar quando tiver definido kernel.sysrqa 1ou um número, incluindo o bit correto em sua /etc/sysctl.d/10-magic-sysrq.conf.
Ruslan
9
@ T.Sar Você não perderá o seu progresso se estiver usando um sistema de construção são. Você manterá todos os arquivos de objeto, exceto o que estava realmente compilando, e poderá voltar para praticamente de onde parou.
Muzer 03/07
3
@ T.Sar Só porque o que você está compilando não é sensato não significa que o sistema de compilação não é sensato. Os sistemas de construção desde tempos imemoriais armazenaram arquivos de objetos para reutilização em compilações subseqüentes. Por outro lado, certamente posso citar muitos projetos de software com menos sanidade do que o Linux (que geralmente é bem projetado). Por exemplo, compilando algo como o Firefox ou o OpenOffice com 8 threads de compilação paralela, eu posso ver isso facilmente na ordem de gigabytes de RAM. Também existem muitos sistemas corporativos monolíticos que dependem de centenas de bibliotecas.
Muzer #
7
O @ T.Sar Linux não é realmente complexo do ponto de vista do compilador. Na verdade, quase não existem programas em C. E o C ++? Você já tentou criar um programa usando o Eigen ou o Boost? Você ficaria surpreso com a quantidade de memória que o compilador às vezes consome com esses programas - e eles não precisam ser complexos.
Ruslan
20

Ao contrário de outras respostas, sugiro que você desative a troca enquanto estiver fazendo isso. Enquanto o swap mantém o sistema em execução de maneira previsível, e geralmente é usado para aumentar a taxa de transferência de aplicativos que acessam o disco (removendo páginas não utilizadas para permitir espaço para o cache do disco), nesse caso, parece que o sistema está sendo mais lento para níveis inutilizáveis ​​porque muita memória usada ativamente está sendo removida à força para troca.

Eu recomendaria desabilitar a troca completamente ao executar esta tarefa, para que o assassino de falta de memória atue assim que a RAM for preenchida.

Soluções alternativas:

  • Aumente a velocidade de leitura do swap colocando sua partição de swap no RAID1
    • Ou RAID0, se você estiver se sentindo arriscado, mas isso reduzirá um grande número de programas em execução, se algum disco falhar.
  • Diminuir o número de trabalhos de construção simultâneos ("mais núcleos = mais velocidade", todos dizemos, esquecendo que é necessário um pedágio linear na RAM)
  • Isso pode acontecer nos dois sentidos, mas tente ativar zswapno kernel. Isso comprime as páginas antes de serem enviadas para troca, o que pode fornecer espaço de manobra suficiente para acelerar sua máquina. Por outro lado, poderia acabar sendo um obstáculo à compressão / descompressão extra que faz.
  • Desative as otimizações ou use um compilador diferente. Às vezes, a otimização do código pode ocupar vários gigabytes de memória. Se você tiver o LTO ativado, também usará muita memória RAM no estágio de link. Se tudo mais falhar, você pode tentar compilar seu projeto com um compilador mais leve (por exemplo tcc), às custas de um leve desempenho em tempo de execução atingido no produto compilado. (Isso geralmente é aceitável se você estiver fazendo isso para fins de desenvolvimento / depuração.)
Score_Under
fonte
6
Se a troca foi desativada, esse é o comportamento do Linux quando a memória está acabando. Se o Linux não chamar o killer de falta de memória, mas congelar, isso pode significar que há problemas mais profundos com a instalação. Obviamente, se a troca estiver ativada, o comportamento será um pouco diferente.
2131717
10
@Akiva Você já tentou sem troca? Esta resposta é imediata. Eu gostaria de acrescentar que a execução sudo swapoff -apode salvá-lo quando você já está em um vínculo: ele interrompe imediatamente qualquer uso adicional de espaço de troca, ou seja, o killer do OOM deve ser chamado no próximo instante e colocar a máquina em funcionamento. sudo swapoff -atambém é uma excelente medida de precaução ao depurar vazamentos de memória ou compilar, digamos, firefox. Normalmente, a troca é um pouco útil (por exemplo, para hibernação ou troca de coisas realmente desnecessárias), mas quando você está realmente usando memória, os congelamentos são piores.
Jonas Schäfer
2
@Score_Under: Partições de troca separadas em cada disco devem ser significativamente mais eficientes do que a troca em um dispositivo md raid0. Eu esqueço onde li isso. O wiki do Linux RAID recomenda partições separadas em relação ao raid0, mas não diz nada muito forte sobre o porquê de ser melhor . De qualquer forma, sim, RAID1 ou RAID10n2 faz sentido para troca, especialmente se você deseja apenas trocar algumas páginas sujas, mas muito frias, para deixar mais RAM para o pagecache. ou seja, o desempenho da troca não é grande coisa.
Peter Cordes
2
O que quero dizer é que, seguindo seu conselho, talvez não seja possível executar esses programas, porque eles precisam ser trocados. Uma compilação que falha 100% do tempo é pior do que uma compilação com 50% de chance de bloquear o sistema, não é?
Dmitry Grigoryev
2
Sem troca, em muitas máquinas, é impossível compilar grandes pedaços de código. Por que você presumiria que é a compilação que ele quer sacrificar?
David Schwartz
14

Você pode usar o seguinte comando (repetidamente, se necessário) para interromper o processo usando a maior quantidade de 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 que utiliza mais memória)
  • xargs kill -9: mate o processo

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

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

Gohu
fonte
5
Isso é muito pior do que deixar o assassino da OOM lidar com a situação. O assassino da OOM é muito mais inteligente que isso. Você realmente executa esses comandos em um computador com compilações em andamento?
Dmitry Grigoryev
@DmitryGrigoryev, é tão inteligente às vezes matar o Xorg na minha área de trabalho. Nos kernels modernos, o OOMK parece ter ganhado um pouco de sanidade, mas eu realmente não confiaria nisso depois de tudo isso.
Ruslan
11

Antes de executar os comandos que consomem recursos, você também pode usar a chamada de sistema setrlimit (2) , provavelmente com o ulimitbuilt-in do seu shell bash (ou o limitbuilt-in no zsh), principalmente com o -vfor RLIMIT_AS. Em seguida, muito grande consumo de espaço de endereços virtuais (por exemplo, com mapeamento de memória (2) ou sbrk (2) usado por malloc (3) ) irá falhar (com errno (3) ser ENOMEM).

Então eles (ou seja, os processos famintos no seu shell, depois que você digitou ulimit) seriam encerrados antes de congelar o seu sistema.

Leia também Linux Ate My RAM e considere desativar o comprometimento excessivo da memória (executando o comando echo 0 > /proc/sys/vm/overcommit_memory como root, consulte proc (5) ...).

Basile Starynkevitch
fonte
11

isso acontece com bastante frequência quando estou compilando software em segundo plano

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

fluffysheap
fonte
2
é apenas uma pena que eu tive que rolar tão longe para encontrar esta resposta. Eu esperava que alguém propusesse uma maneira de suspender o progresso desse comedor de RAM.
TOOGAM
Não é nada perto da resposta que o OP espera, mas responde à pergunta literária: minha máquina de porcaria fica inutilizável quando eu construo nela - pare de construir em máquina de porcaria.
precisa saber é o seguinte
9

Crie um pouco mais de troca para si mesmo.

O seguinte adicionará 8G de swap:

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

Ainda será lento (você está trocando), mas na verdade não deve acabar. Versões modernas do Linux podem ser trocadas por arquivos. Atualmente, o único uso para uma partição de swap é para hibernar o seu laptop.

William Hay
fonte
11
Eu tenho esse método implementado como um script, na verdade, aqui . Bastante útil para adicionar swap em tempo real.
Sergiy Kolodyazhnyy
7
Algumas trocas são geralmente sábias, mas alocar grandes quantidades simplesmente permite que a máquina se debata mais antes que o assassino do OOM intervenha e escolha um voluntário. O velho e tradicional papel do polegar sobre "dobrar seu carneiro como troca" está morto há muito tempo. Pessoalmente, não vejo valor em alocar mais do que aproximadamente 1 GB de swap total.
Criggie
5
Com ext4, você pode fallocate -l 8G /root/moreswap, em vez de ddevitar sempre a necessidade de fazer 8GB de I / O, enquanto o sistema está se debatendo. Isso não funciona com nenhum outro sistema de arquivos. Definitivamente não é o XFS, onde o swapon vê extensões não escritas como buracos. (Acho que essa discussão na lista de discussão xfs não deu certo). Consulte também swapdum daemon que cria / remove arquivos de troca em tempo real para economizar espaço em disco. Também askubuntu.com/questions/905668/...
Peter Cordes
11
@Criggie "Pessoalmente, não vejo valor em alocar mais do que aproximadamente 1 GB de swap total" - Você tentou criar o Firefox?
Dmitry Grigoryev
11
@Akiva A última vez que verifiquei, a configuração de compilação recomendada era 16 GB de RAM. O principal arquivo executável ( xul.dll) tem cerca de 50 MB, portanto é 10 vezes mais pesado que o kernel Linux.
Dmitry Grigoryev
5

Uma maneira de obter um pouco de RAM livre em um curto espaço de tempo é usar o zram , que cria um disco RAM compactado e troca lá. Com qualquer CPU meio decente, isso é muito mais rápido que a troca regular, e as taxas de compactação são bastante altas com muitos porcos de RAM modernos, como navegadores da web.

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

sudo service zramswap start
Dmitry Grigoryev
fonte
Isso funciona em todos os sistemas de arquivos como o btrfs?
Akiva
11
@Akiva zram nunca toca o disco, então eu diria que sim;)
Dmitry Grigoryev
3

sudo swapoff -adesativará a troca, fazendo o kernel automaticamente matar o processo com a pontuação mais alta se o sistema ficar sem memória. Eu uso isso se eu souber que executarei algo com muita RAM que eu prefiro matar se ficar fora de controle do que deixá-lo entrar em troca e ficar preso para sempre. Use sudo swapon -apara reativá-lo posteriormente.

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

sudo
fonte
Acabei de ver que alguém comentou isso em algum lugar.
Sudo
3

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

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

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

drop_caches

Escrever isso fará com que o kernel elimine caches limpos, além de objetos recuperáveis ​​de lajes, como dentries e inodes. Uma vez descartada, a memória delas fica livre .

Para liberar pagecache: echo 1> / proc / sys / vm / drop_caches Para liberar objetos recuperáveis ​​da laje (inclui dentries e inodes): echo 2> / proc / sys / vm / drop_caches Para liberar objetos da laje e pagecache: echo 3> / proc / sys / vm / drop_caches

Esta é uma operação não destrutiva e não liberará nenhum objeto sujo. Para aumentar o número de objetos liberados por esta operação, o usuário pode executar `sync 'antes de gravar em / proc / sys / vm / drop_caches. Isso minimizará o número de objetos sujos no sistema e criará mais candidatos a serem descartados.

Sergiy Kolodyazhnyy
fonte
Interessante ... gostaria de explicar essa lógica de comando?
Akiva
11
@ Akiva, basicamente, diz ao kernel do Linux para liberar a RAM. Isso não se livra da causa, que está matando o processo ofensivo, então a resposta de Oli é a solução para o problema. A eliminação de caches impedirá que o sistema fique sem memória e, portanto, o congelamento, assim, você ganha tempo para descobrir o problema real. Este será, provavelmente, um pouco mais rápido do que fazer um arquivo de troca, especialmente se você estiver no disco rígido e não no SSD
Sergiy Kolodyazhnyy
7
O cache é a primeira coisa a ser executada quando você preenche memória, por isso não acho que isso ajude muito. Na verdade, não acho que esse comando tenha um uso prático fora do comportamento de depuração do kernel ou da otimização do tempo de acesso ao disco. Eu humildemente recomendaria não executar este comando em qualquer sistema que precise de mais desempenho.
Score_Under
2
@Score_Under - "O cache é a primeira coisa a se esgotar quando você preenche memória" - bem, isso depende da sua configuração /proc/sys/vm/swappiness. Com o swappiness definido como 0, você está certo. Com a configuração padrão de 60, você está perto. Se estiver definido como 200, no entanto, serão as páginas de processos em execução menos usadas recentemente que serão descartadas primeiro ... nesse caso específico, esse comando pode ser útil. Mas definir a troca como 0 (ou algum valor baixo, talvez 20 ou 30) seria uma abordagem geral melhor, no entanto.
Jul4
3
@Score_Under Este comando foi útil em kernels antigos com kswapdbug (algumas pessoas até criaram cronjobs com ele). Mas você está certo, duvido que ajude com esta pergunta.
Dmitry Grigoryev
1

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

Os ambientes de desenvolvimento geralmente permitem iniciar vários processos em desenvolvimento; eles podem ficar paralisados ​​também depois que você não estiver mais interessado neles (no depurador ou apenas não for 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 finalizado no IDE está finalizado.

h22
fonte