A execução de qualquer comando retorna "Não é possível alocar memória" no Ubuntu Server

16

Estou usando o Ubuntu 14.04. Recentemente, quando eu faço login via SSH com meu usuário com privilégios sudo, todos os comandos que eu executo resultam no erro "Não é possível alocar memória". Aqui estão alguns que eu tentei no meu console

myuser@mymachine:~$ whoami
-bash: fork: Cannot allocate memory
myuser@mymachine:~$ uname -a
-bash: fork: Cannot allocate memory

Mesmo que eu tente sudo reboot now, recebo o erro acima, então não sei mais o que posso tentar desbloquear minha instância. O host é o DigitalOcean, se isso importa.

Edit: Pela resposta / sugestão dada aqui é a saída de "grátis"

myuser@mymachine:~$ free
-bash: fork: Cannot allocate memory
Dave
fonte

Respostas:

12

Solução

Como indicado nas mensagens de erro, sua máquina ficou sem memória. Isso pode ser por várias razões, mas basicamente, algo está consumindo toda a sua memória e não deixando nenhuma esquerda para o uso básico de comandos.

Eu sugiro que você reinicie o seu droplet (basta ir ao painel de controle do cliente e selecionar "Reiniciar"), sshem e depois executar topou htop. Fique de olho no uso da memória e veja qual processo está consumindo toda a memória. A partir daí, tente

  1. Matar / removendo a / processo do programa defeituoso

    ATENÇÃO : POR FAVOR fazer sua pesquisa sobre se o processo é um processo do sistema essencial, em primeiro lugar! Se um processo do sistema estiver causando problemas de memória, não o mate, pesquise e encontre maneiras específicas de lidar com ele.
  2. Alterar a configuração desse programa / processo para que ele não consuma toda a sua memória.

Sugestões para impedir que o problema ocorra novamente

  • Algo bom a fazer é adicionar memória de troca , pois aloca mais memória se você estiver acabando.
  • Sempre que você instala programas, certifique-se de configurá-los corretamente para que não funcionem de maneira não intencional (como consumir memória)
  • Após cada vez que você adiciona um pacote ou basicamente qualquer coisa nova é configurada, verifique com htopou toppara ver quanta memória você está usando nos programas atuais. Se você perceber que está usando quase tudo, tente limpar algumas delas, removendo programas / processos desnecessários.
  • Se houver algo que está sendo iniciado automaticamente (além dos processos do sistema, é claro!) Que você não reconhece ou deseja iniciar automaticamente, remova-o! Mas sempre faça sua pesquisa sobre o que é um processo antes de matá-lo / excluí-lo, pois pode ser essencial para procedimentos de inicialização ou funções do sistema, etc.
TheOdd
fonte
7

Para sair dessa condição sem reiniciar, você pode acionar o killer do OOM manualmente da seguinte maneira:

echo 1 > /proc/sys/kernel/sysrq
echo f > /proc/sysrq-trigger
echo 0 > /proc/sys/kernel/sysrq

Referência

Luke F
fonte
Você tem alguma documentação que suporte esses comandos? Por que não apenas sudo sysctl -w vm.oom_kill_allocating_task=1ou permanentemente/etc/sysctl.conf ?
Pablo Bianchi
1
Não parece que isso faria diferença, o sistema não atinge uma condição real de OOM se isso acontecer em repouso, porque nenhum processo está tentando alocar memória e nenhum processo adicional pode ser iniciado. E semi-independente, mas você não seria capaz de usar o sudo ou o sysctl uma vez nesse estado.
Luke F
Isso funcionou para mim. Não sei como, não me importo. Eu nem era capaz de executar sudo rebootantes de executar isso. Obrigado!
boulder_ruby
0

Para concluir a resposta aceita, há uma coisa a considerar: Seu sistema pode ficar sem identificadores de arquivo ou até buffers de soquete e ainda ter muita memória enquanto fornece o mesmo erro. Isto é especialmente verdade se a hospedagem compartilhada impuser limites dessa natureza. Nos sistemas OpenVZ, assista ao conteúdo de

# cat / proc / user_beancounters

Isso fornecerá na primeira coluna as primeiras ultrapassagens. Se isso for verdade, mude para um pacote de hospedagem maior ou procure o culpado mais provável: o banco de dados mysql ou mariadb que pode, na presença de um aplicativo PHP com defeito, vazar identificadores de arquivo para centenas por segundo.

Isso também pode acontecer se o servidor da web estiver aberto na Internet e aceitar logins de nome de usuário / senha: mesmo se você tiver o fail2ban em execução, poderá ter atraído uma quebra de dicionário distribuída na tentativa, que também consome muitos recursos.

aquaherd
fonte