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 sudo
comando.
Que comando pode me impedir de fazer uma reinicialização completa ou qualquer reinicialização?
command-line
ram
freeze
swap
Akiva
fonte
fonte
make
, tente,-j4
por exemplo, 4 compilações paralelas por vez.Respostas:
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?
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 aoSIGKILL
(sinal número 9), mas os navegadores são extremamente resilientes. Mais do que isso, encerrar lentamente viaSIGTERM
significa 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
htop
para depurar o problema. Acho que nunca fiquei sem memória RAM a ponto de não conseguirhtop
levantar.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.
fonte
lazygit
comando que eu uso de tempos em tempos, talvez algo assim possa ser aplicado aqui? Okillall ...
script inteiro pode ser reduzido a um simplesemptyram
ou algo assim #emptyram
roteiro do que apenas escreverkillall -9 firefox
.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.
fonte
kernel.sysrq
a1
ou um número, incluindo o bit correto em sua/etc/sysctl.d/10-magic-sysrq.conf
.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:
zswap
no 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.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.)fonte
sudo swapoff -a
pode 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 -a
també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.Você pode usar o seguinte comando (repetidamente, se necessário) para interromper o processo usando a maior quantidade de RAM do seu sistema:
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óriahead -1
: mantenha apenas a primeira linha (processo que utiliza mais memória)xargs kill -9
: mate o processoEdite 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
).fonte
Antes de executar os comandos que consomem recursos, você também pode usar a chamada de sistema setrlimit (2) , provavelmente com o
ulimit
built-in do seu shell bash (ou olimit
built-in no zsh), principalmente com o-v
forRLIMIT_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) serENOMEM
).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) ...).fonte
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.
fonte
Crie um pouco mais de troca para si mesmo.
O seguinte adicionará 8G de swap:
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.
fonte
fallocate -l 8G /root/moreswap
, em vez dedd
evitar 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émswapd
um daemon que cria / remove arquivos de troca em tempo real para economizar espaço em disco. Também askubuntu.com/questions/905668/...xul.dll
) tem cerca de 50 MB, portanto é 10 vezes mais pesado que o kernel Linux.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
fonte
sudo swapoff -a
desativará 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. Usesudo swapon -a
para 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.
fonte
Outra coisa que você pode fazer é liberar o cache da página de memória através deste comando:
Da documentação do kernel.org (ênfase adicionada):
fonte
/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.kswapd
bug (algumas pessoas até criaram cronjobs com ele). Mas você está certo, duvido que ajude com esta pergunta.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.
fonte