Falta de memória no VPS: o que é o OOM killer e o que fazer

Quando a memória e a troca (swap) se esgotam, o núcleo do Linux escolhe um processo e mata-o para salvar o sistema. Chama-se OOM killer (out of memory). Costuma escolher um dos maiores, e num servidor web esse é muitas vezes a base de dados. O sintoma que vê é um serviço que desaparece sem aviso e “volta” depois de reiniciado. Para confirmar, procure a marca no registo do núcleo; para resolver, descubra quem consome a memória e reduza-o, ou dê mais memória à máquina.

Confirmar que foi isto

1 Procure a marca no registo do núcleo: sudo dmesg -T | grep -i -E "out of memory|killed process" ou sudo journalctl -k | grep -i "killed process". Aparece o nome do processo morto e a hora.
2 Veja o estado da memória: free -h. A coluna que importa é available, não “free”: o Linux usa a memória livre para cache, o que é normal.
3 Veja quem a gasta: ps aux --sort=-%mem | head lista os dez maiores. Repare em vários processos iguais (PHP-FPM, Apache) e em programas que crescem com o tempo.
4 Cruze com a hora. Se a morte coincide com um pico de visitas, uma cópia de segurança ou uma tarefa do cron, tem a causa. Ver o que usa CPU, memória e disco explica como acompanhar isto ao longo do dia.

As soluções, da mais barata à mais cara

O que fazer Quando serve
Reduzir o que corre Desligar serviços que não usa; olhar para o que arranca com o servidor (systemctl list-unit-files --state=enabled).
Afinar os trabalhadores do servidor web e do PHP Cada processo do PHP-FPM ou do Apache gasta memória; se o máximo permitido (no PHP-FPM, pm.max_children) multiplicado pelo tamanho de cada um é maior do que a memória, o servidor morre num pico. Baixe o máximo.
Afinar a base de dados O MariaDB e o MySQL reservam memória para cache (no InnoDB, innodb_buffer_pool_size). Um valor pensado para uma máquina maior sufoca uma pequena.
Limitar um serviço No systemd, MemoryMax= numa unidade (crie uma alteração com sudo systemctl edit nome). Um serviço descontrolado é parado antes de arrastar os outros. Nos contentores, o Docker tem a opção --memory.
Corrigir a causa na aplicação Uma fuga de memória, uma consulta que carrega tudo, um plugin que ficou pesado. O OOM é só o aviso.
Ter swap Dá folga para picos curtos, mas é disco, e muito mais lento. Serve de amortecedor, não de cura. Como se acrescenta: acrescentar swap a um VPS.
Mais memória Quando o uso normal já não cabe. Veja os planos em servidores VPS e o que o seu serviço permite em Meu Interweb.
Se a base de dados foi morta a meio de uma escrita, verifique-a depois de a arrancar. No registo da base de dados procure mensagens de recuperação ou de tabelas “crashed”, e confira o site. Veja tabelas marcadas como estragadas. Uma cópia recente é o que a salva: cópias com mysqldump e pg_dump.
Não é a mesma coisa que o erro do PHP “Allowed memory size exhausted”. Esse é um limite do próprio PHP para um script, e o servidor continua de pé: o limite de memória do PHP. O OOM é do sistema inteiro.
Antes de comprar mais memória, meça. Muitos casos resolvem-se baixando um número de configuração. E se pretende correr programas pesados (Docker, vários sites, automação de browser), some o que cada um precisa, segundo a documentação deles, antes de escolher o plano. Veja também erros comuns de VPS e Cloud.

O serviço morre e não percebe porquê? Cole-nos as linhas do registo do núcleo e o nome do plano, e dizemos o que se vê do nosso lado.

Abrir um pedido de suporte

VEJA TAMBÉM

Ver o que usa CPU, memória e disco

Um serviço não arranca: ler o systemctl status

Erros comuns de VPS e Cloud

VPS, Cloud ou dedicado: como escolher

PRODUTO RECOMENDADO

Servidor VPS com acesso root

Recursos só seus, o sistema que escolher, reinstalação quando quiser. desde 7.560,00 Kz/mês (plano de 3 anos, com cupão)

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?