Solução de Problemas de Exaustão de Recursos no Linux: CPU, Memória e Espaço em Disco
Solucione problemas de exaustão de CPU, memória e disco no Linux com comandos práticos, etapas de limpeza seguras e verificações de causa raiz.
Solução de Problemas de Exaustão de Recursos no Linux: CPU, Memória e Espaço em Disco
Quando um servidor Linux fica sem CPU, memória ou espaço em disco, o primeiro sintoma geralmente é vago: o site está lento, o SSH trava após o login, as implantações falham ou um serviço reinicia constantemente. A maneira mais rápida de lidar com o incidente é identificar qual recurso está esgotado e, em seguida, encontrar o processo ou sistema de arquivos por trás disso.
Faça primeiro as verificações menos arriscadas. Comandos somente leitura, como top, free, df, du, vmstat e journalctl, fornecem uma visão geral sem alterar a máquina. Matar processos e excluir arquivos pode ser necessário, mas não é diagnóstico.
Identificando o Culpado: Monitorando os Recursos do Sistema
Antes de corrigir um problema de exaustão de recursos, você precisa identificar qual recurso está sendo sobrecarregado e qual processo é o responsável. O Linux fornece um rico conjunto de ferramentas de linha de comando para esse fim.
Monitoramento de Uso de CPU
O alto uso de CPU pode tornar seu sistema lento e sem resposta. Geralmente é causado por um processo descontrolado, um aplicativo exigente ou um script ineficiente.
top: Este é um monitor de sistema em tempo real indispensável. Ele exibe uma lista dinâmica de processos, classificados por uso de CPU por padrão. Você pode ver a utilização geral da CPU, o uso de memória e os detalhes de cada processo.topDentro do
top, pressione1para ver o uso individual de cada núcleo da CPU. PressionePpara classificar por uso de CPU. Procure por processos que consomem consistentemente uma alta porcentagem de CPU.htop: Uma versão aprimorada e interativa dotop. Geralmente é preferido por sua facilidade de uso, saída colorida e navegação mais fácil.htopSemelhante ao
top, ohtoppermite classificar por uso de CPU e fornece informações detalhadas do processo.mpstat: Parte do pacotesysstat, ompstatfornece estatísticas detalhadas da CPU, incluindo uso por processador, contagens de interrupções e trocas de contexto.mpstat -P ALL 1Este comando exibirá estatísticas de CPU para todos os núcleos a cada segundo.
Verifique também a média de carga em relação ao número de CPUs:
uptime
nproc
Uma média de carga de 8 significa algo muito diferente em uma VM de 2 núcleos do que em um host de 32 núcleos. A carga também inclui tarefas aguardando E/S não interrompível, portanto, uma média de carga alta com baixo uso de CPU pode, na verdade, apontar para disco ou armazenamento em rede.
Monitoramento de Uso de Memória
Quando um sistema fica sem RAM disponível e espaço de swap, ele começa a usar espaço em disco como memória virtual, o que é significativamente mais lento, levando a uma degradação severa do desempenho.
free -h: Exibe a quantidade total de memória física e swap livre e usada no sistema, juntamente com os buffers e caches usados pelo kernel. A flag-htorna a saída legível para humanos (por exemplo, MB, GB).free -hPreste atenção à memória
availablee ao espaço de swapused. O alto uso de swap indica RAM insuficiente.top/htop: Tantotopquantohtopmostram o uso de memória por processo. Procure por processos com um valor alto de%MEM.vmstat: Relata estatísticas de memória virtual. Pode mostrar informações sobre processos, memória, paginação, E/S de bloco, traps e atividade da CPU.vmstat 5Este comando relatará estatísticas a cada 5 segundos. Observe as colunas
si(swap-in) eso(swap-out); valores altos indicam troca de memória significativa.
Para possíveis mortes por OOM, verifique o log do kernel:
dmesg -T | grep -i 'killed process'
journalctl -k --since "1 hour ago" | grep -i oom
Uma morte por OOM muda o incidente. A questão imediata passa a ser qual processo foi morto, por que excedeu a memória disponível e se o systemd ou um orquestrador o reiniciou.
Monitoramento de Espaço em Disco
Uma partição de disco cheia pode impedir que os aplicativos gravem dados, causar erros e até mesmo impedir que o sistema inicialize.
df -h: Relata o uso de espaço em disco do sistema de arquivos. A flag-htorna a saída legível para humanos.df -hEste comando listará todos os sistemas de arquivos montados e mostrará seu tamanho total, espaço usado, espaço disponível e ponto de montagem. Procure por partições com uso próximo ou em 100%.
du -sh <diretório>: Estima o uso de espaço em arquivo para um determinado diretório. A flag-sresume e-htorna legível para humanos.du -sh /var/log/*Use isso para descobrir quais subdiretórios estão consumindo mais espaço em disco.
Verifique também o uso de inodes:
df -ih
Um sistema de arquivos pode ter gigabytes livres e ainda assim ser incapaz de criar arquivos se ficar sem inodes. Isso acontece com milhões de arquivos pequenos: entradas de cache, filas de e-mail, arquivos de sessão, artefatos de compilação ou logs mal rotacionados.
Resolvendo Problemas de Exaustão de Recursos
Depois de identificar o recurso problemático e o processo ofensor, você pode tomar medidas para resolver o problema.
Lidando com Alto Uso de CPU
- Identifique o Processo: Use
topouhtoppara encontrar o ID do processo (PID) que está consumindo muita CPU. - Investigue o Processo: Determine o que é o processo. É um aplicativo de usuário, um serviço do sistema ou algo inesperado?
- Uso Legítimo Alto: Se um aplicativo legítimo está usando muita CPU (por exemplo, compilando software, codificando vídeo), você pode precisar esperar que ele termine, agendá-lo para horários de menor movimento ou atualizar seu hardware.
- Processo Descontrolado: Se um processo está preso em um loop ou consumindo CPU excessiva sem intenção, você pode tentar reiniciá-lo. Se isso não funcionar, pode ser necessário encerrá-lo.
- Encerre o Processo (Use com Cautela!): Você pode usar o comando
killpara enviar sinais aos processos. Os sinais mais comuns são:SIGTERM(15): Solicita educadamente que o processo termine.SIGKILL(9): Força o encerramento imediato do processo. Isso deve ser um último recurso, pois não permite que o processo faça uma limpeza.
# Encerrar graciosamente o processo com PID 1234 kill 1234 # Forçar o encerramento do processo com PID 1234 kill -9 1234 - Verifique os Logs: Examine os logs do sistema (por exemplo,
/var/log/syslog,/var/log/messages, logs específicos do aplicativo) em busca de erros relacionados ao processo problemático. - Otimize Aplicativos/Scripts: Se o alto uso de CPU for devido a um aplicativo ou script ineficiente, considere otimizar o código ou a configuração.
CPU alta nem sempre é ruim. Um trabalho em lote usando todos os núcleos por um curto período pode ser aceitável. Um processo de thread único travado em 100% de um núcleo enquanto as solicitações ficam na fila atrás dele é diferente. Observe a duração, o impacto no usuário e se o processo deve estar ocupado.
Se você precisar de mais contexto antes de reiniciar um serviço, capture um instantâneo:
ps -fp <pid>
sudo lsof -p <pid> | head
sudo strace -p <pid> -tt -T -f
Use strace com cuidado em sistemas de produção. Ele pode adicionar sobrecarga, mas uma amostra curta geralmente informa se o processo está em loop, aguardando arquivos, falhando em chamadas de rede ou abrindo repetidamente o mesmo recurso.
Resolvendo Vazamentos de Memória e Exaustão
Um vazamento de memória ocorre quando um programa falha em liberar a memória que não precisa mais, consumindo gradualmente toda a RAM disponível. Isso pode levar a trocas excessivas e falta de resposta do sistema.
- Identifique o Processo: Use
topouhtoppara encontrar processos com alta memória (%MEM) ou valores de tamanho do conjunto residente (RSS) que estão aumentando constantemente ao longo do tempo. - Investigue o Processo: Determine a natureza do aplicativo. É um aplicativo conhecido com possíveis problemas de memória ou algo personalizado?
- Reinicie o Aplicativo/Serviço: Muitas vezes, simplesmente reiniciar o aplicativo ou serviço pode resolver temporariamente um vazamento de memória, liberando a memória acumulada.
# Exemplo: Reiniciar o servidor web Apache sudo systemctl restart apache2 - Verifique o Monitoramento Específico do Aplicativo: Muitos aplicativos (por exemplo, servidores web, bancos de dados) têm suas próprias ferramentas de monitoramento ou logs que podem ajudar a diagnosticar problemas de memória.
- Analise Core Dumps: Para aplicativos críticos, você pode precisar ativar core dumps e usar ferramentas de depuração (como
gdb) para analisar o estado da memória quando o vazamento ocorre. Esta é uma etapa de solução de problemas avançada. - Aumente o Espaço de Swap (Medida Temporária): Se você não puder resolver o vazamento imediatamente, pode aumentar o espaço de swap para fornecer mais memória virtual. No entanto, isso é uma solução alternativa, não uma solução.
- Atualização de Hardware: Se o seu sistema fica consistentemente sem memória para sua carga de trabalho, você pode precisar adicionar mais RAM física.
Uma investigação de memória melhor observa a mudança ao longo do tempo. Uma captura de tela do top apenas diz quem está grande agora. Um vazamento é uma tendência.
while true; do
date
ps -eo pid,comm,rss,%mem --sort=-rss | head -15
sleep 60
done
Se o mesmo processo sobe constantemente entre as amostras sem cair após a queda do tráfego, você tem um sinal de vazamento mais forte. Se muitos processos crescem juntos durante o pico de tráfego, a carga de trabalho pode simplesmente exceder a capacidade ou os limites de concorrência.
Para serviços systemd, verifique se os limites de memória já existem:
systemctl show <serviço> -p MemoryCurrent -p MemoryMax
Para contêineres, free -h no nível do host pode parecer bom enquanto um contêiner atinge seu próprio limite. Verifique docker stats, kubectl top pod ou os eventos do orquestrador para mortes por OOM.
Gerenciando Partições de Disco Cheias
Quando uma partição de disco fica cheia, pode causar várias falhas no sistema. A ação imediata geralmente é necessária.
- Identifique a Partição Cheia: Use
df -hpara localizar a(s) partição(ões) com capacidade de 100%. - Encontre Arquivos/Diretórios Grandes: Use
du -shoudu -h --max-depth=1 <diretório>para navegar pela árvore de diretórios e descobrir o que está consumindo espaço.
Os culpados comuns incluem arquivos de log (# Encontre os maiores diretórios na partição raiz sudo du -h --max-depth=1 / | sort -rh/var/log), arquivos temporários (/tmp), caches de pacotes e dados do usuário. - Limpe os Arquivos de Log: Os arquivos de log podem crescer muito. Muitas vezes, você pode excluir logs antigos com segurança ou configurar a rotação de logs (
logrotate) para gerenciar seu tamanho automaticamente.- Excluindo Logs Antigos: Tenha cuidado e certifique-se de não estar excluindo logs ativos. Você pode usar
findpara excluir arquivos mais antigos que um certo número de dias.# Excluir arquivos .log mais antigos que 30 dias em /var/log/myapp sudo find /var/log/myapp -name "*.log" -type f -mtime +30 -delete - Rotação de Logs: Certifique-se de que o
logrotateesteja configurado corretamente para seus serviços. Ele normalmente é executado diariamente e lida com o arquivamento e exclusão de logs antigos.
- Excluindo Logs Antigos: Tenha cuidado e certifique-se de não estar excluindo logs ativos. Você pode usar
- Limpe o Cache do Gerenciador de Pacotes: Os gerenciadores de pacotes geralmente mantêm os arquivos de pacotes baixados. Limpar isso pode liberar espaço significativo.
- Debian/Ubuntu (apt):
sudo apt autoremove sudo apt clean - CentOS/RHEL/Fedora (yum/dnf):
sudo yum autoremove # ou dnf autoremove sudo yum clean all # ou dnf clean all
- Debian/Ubuntu (apt):
- Remova Pacotes Não Utilizados: Desinstale software que você não precisa mais.
- Debian/Ubuntu:
sudo apt remove <nome_do_pacote> - CentOS/RHEL/Fedora:
sudo yum remove <nome_do_pacote>ousudo dnf remove <nome_do_pacote>
- Debian/Ubuntu:
- Verifique Diretórios Temporários: Os arquivos em
/tmpgeralmente podem ser excluídos com segurança, especialmente após uma reinicialização, mas tome cuidado se os aplicativos os estiverem usando ativamente. - Esvazie a Lixeira: Se você estiver usando um ambiente de desktop, verifique as lixeiras do usuário.
- Considere Redimensionar Partições: Se o espaço for um problema consistente e a limpeza não for suficiente, você pode precisar redimensionar as partições ou adicionar mais armazenamento. Esta é uma operação mais avançada que pode exigir a desmontagem de partições ou a inicialização a partir de um ambiente live.
Tenha cuidado com arquivos excluídos que ainda estão abertos. df pode mostrar um sistema de arquivos cheio mesmo depois de você remover um arquivo de log grande, porque um processo em execução ainda tem o identificador do arquivo aberto.
sudo lsof +L1
Se um arquivo excluído ainda estiver aberto, reiniciar ou recarregar o serviço proprietário libera o espaço. Faça isso intencionalmente; não reinicie um banco de dados ou serviço crítico no meio de um incidente sem entender o impacto.
Para logs do journal, prefira a limpeza com journalctl em vez de excluir arquivos manualmente:
journalctl --disk-usage
sudo journalctl --vacuum-time=14d
Para hosts Docker, verifique os logs do contêiner e as imagens não utilizadas:
docker system df
docker ps --size
Não execute comandos de poda amplos cegamente em um host de produção. Eles podem remover imagens, cache de compilação, contêineres parados e redes que alguém esperava manter.
Uma Ordem de Triagem que Funciona Sob Pressão
Quando tudo está lento, use uma ordem fixa para não pular entre teorias.
Confirme que o host está acessível e não somente leitura:
uptime date mount | grep ' ro,'Verifique CPU e carga:
top uptimeVerifique memória e swap:
free -h vmstat 1 5Verifique espaço em disco e inodes:
df -h df -ihVerifique erros recentes do kernel e de serviço:
journalctl -p warning..alert --since "30 minutes ago" journalctl -k --since "30 minutes ago"
Esta ordem captura as falhas comuns rapidamente: saturação de CPU, tempestades de swap, sistemas de arquivos cheios, exaustão de inodes, mortes por OOM e erros de armazenamento.
Escolhendo a Correção Imediata Menos Pior
Durante uma interrupção, você pode precisar de uma correção de curto prazo antes que a correção permanente esteja pronta.
Para exaustão de CPU, uma reinicialização graciosa do serviço pode ser mais segura do que kill -9, especialmente para software que grava estado. Se um trabalho em segundo plano está sufocando o tráfego do usuário, diminua sua prioridade:
sudo renice +10 -p <pid>
sudo ionice -c2 -n7 -p <pid>
Para exaustão de memória, reduzir a concorrência geralmente é mais seguro do que adicionar swap e esperar. Reduza as contagens de workers da web, pause trabalhos em lote ou desative temporariamente recursos caros. O swap pode ganhar tempo, mas o swap pesado geralmente transforma uma falha clara em uma falha lenta.
Para exaustão de disco, exclua ou rotacione arquivos que você entende. Bons candidatos são logs compactados antigos, caches de pacotes, artefatos de compilação obsoletos e arquivos temporários de trabalhos parados. Maus candidatos são arquivos de banco de dados, logs ativos, arquivos desconhecidos em diretórios de dados do aplicativo e qualquer coisa que você não possa explicar.
Notas de Causa Raiz para Capturar
Depois que o sistema estiver estável, anote o que mudou. Notas úteis são concretas:
- O sistema de arquivos ou recurso exato que foi esgotado.
- O processo, usuário, serviço, contêiner ou trabalho cron envolvido.
- A saída do comando que provou isso.
- A ação imediata tomada.
- A correção permanente necessária.
Isso não é papelada por si só. O próximo incidente é muito mais fácil quando você sabe que /var encheu porque os logs de depuração cresceram após uma implantação, ou que a pressão de memória começou quando a contagem de workers dobrou.
Melhores Práticas para Prevenção
- Monitoramento Regular: Implemente o monitoramento regular de CPU, memória e espaço em disco usando ferramentas como
top,htop,free,dfe soluções de monitoramento dedicadas (por exemplo, Nagios, Zabbix, Prometheus). - Automatize a Rotação de Logs: Certifique-se de que o
logrotateesteja configurado corretamente para todos os serviços que geram logs. - Ajuste as Configurações do Aplicativo: Otimize as configurações do aplicativo para serem mais eficientes em termos de recursos. Por exemplo, ajuste os processos de worker do servidor web, pools de conexão de banco de dados, etc.
- Configure Alertas: Configure alertas para uso alto sustentado, crescimento rápido, mortes por OOM, saturação do sistema de arquivos, exaustão de inodes e reinicializações de serviço. Alerte sobre tendências, não apenas limites rígidos.
- Atualizações do Sistema: Mantenha seu sistema e aplicativos atualizados, pois melhorias de desempenho e correções de bugs geralmente são incluídas em versões mais recentes.
- Limites de Recursos: Para sistemas multiusuário ou ambientes conteinerizados, considere definir limites de recursos (por exemplo, usando
ulimitou cgroups) para evitar que um único processo prive outros.
A solução de problemas de exaustão de recursos é principalmente um estreitamento disciplinado. Encontre o recurso restrito, identifique o proprietário, faça a menor alteração estabilizadora e, em seguida, corrija o motivo pelo qual isso aconteceu. As ferramentas básicas são suficientes para a maioria dos incidentes se você as usar nessa ordem e resistir ao impulso de excluir ou matar antes de entender o que está tocando.