Quando um servidor Linux começa a apresentar lentidão, consumo elevado de recursos ou comportamento inesperado, uma das primeiras tarefas é descobrir o que está acontecendo com o sistema.
Antes de sair reiniciando serviços ou culpando o banco de dados, vale olhar os recursos disponíveis: CPU, memória, processos em execução, carga do sistema e, em alguns casos, I/O de disco.
O Linux possui diversas ferramentas nativas para esse diagnóstico. A mais conhecida provavelmente é o top, mas existem outros comandos que, utilizados em conjunto, fornecem uma visão muito mais completa do sistema.
Neste artigo, veremos alguns dos principais comandos para monitorar CPU e memória em servidores Linux.
1. O clássico top
O comando top é uma das ferramentas mais tradicionais para monitoramento de sistemas Linux.
Basta executar:
top
O resultado será atualizado continuamente, mostrando informações sobre o sistema e os processos em execução.
Uma saída típica apresenta algo semelhante a:
top - 10:32:15 up 15 days, 4:21, 2 users, load average: 0.42, 0.38, 0.31
Tasks: 214 total, 1 running, 213 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.2 us, 1.3 sy, 0.0 ni, 94.1 id, 0.2 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 15932.4 total, 2145.3 free, 4821.7 used, 8965.4 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 www-data 20 0 512000 120000 15000 R 85.2 0.7 2:15.33 php-fpm
2345 mysql 20 0 2048000 500000 30000 S 12.4 3.1 15:42.21 mysqld
Vamos entender as informações mais importantes.
2. Load Average
Logo no início da tela do top temos:
load average: 0.42, 0.38, 0.31
Os três valores representam a carga média do sistema nos últimos:
- 1 minuto
- 5 minutos
- 15 minutos
O load average não representa simplesmente o percentual de utilização da CPU.
Ele indica, de forma simplificada, quantos processos estão utilizando ou aguardando recursos do sistema, incluindo situações relacionadas à CPU e I/O.
Para interpretar corretamente, é importante considerar a quantidade de CPUs disponíveis.
Em um servidor com 1 núcleo, um load average próximo de:
1.00
indica que existe aproximadamente uma unidade de trabalho ocupando a capacidade disponível.
Em um servidor com 8 CPUs, uma carga de:
1.00
é relativamente baixa.
Já uma carga de:
8.00
representa uma utilização muito mais significativa.
Para descobrir quantas CPUs o sistema possui:
nproc
Ou:
lscpu
Uma forma simples de observar a carga atual é:
uptime
Exemplo:
10:32:15 up 15 days, 4:21, 2 users, load average: 0.42, 0.38, 0.31
Se o primeiro valor estiver constantemente muito acima da quantidade de CPUs disponíveis, vale investigar.
3. Entendendo o uso da CPU
Ainda no top, encontramos:
%Cpu(s): 4.2 us, 1.3 sy, 0.0 ni, 94.1 id, 0.2 wa, 0.0 hi, 0.2 si, 0.0 st
Os principais campos são:
us — User
Percentual de CPU utilizado por processos de usuário.
Por exemplo:
- PHP
- Apache
- MySQL
- scripts
- aplicações
Um valor elevado aqui normalmente indica que algum processo está efetivamente consumindo CPU.
sy — System
Tempo de CPU utilizado pelo kernel do Linux.
Pode aumentar em situações envolvendo:
- operações de rede
- acesso a dispositivos
- chamadas de sistema
- processamento intenso pelo kernel
id — Idle
Percentual de CPU ociosa.
Se estiver em:
95.0 id
significa que aproximadamente 95% da capacidade da CPU está ociosa naquele momento.
wa — I/O Wait
Tempo em que a CPU está aguardando operações de I/O.
Esse campo merece atenção.
Um servidor pode apresentar CPU relativamente livre e ainda assim estar lento por causa de operações de disco.
Por exemplo:
%Cpu(s): 5.0 us, 2.0 sy, 60.0 id, 33.0 wa
Nesse cenário, não parece haver falta de CPU. O problema pode estar relacionado a armazenamento ou I/O.
st — Steal Time
É especialmente relevante em ambientes virtualizados.
Indica tempo de CPU que foi “roubado” pela camada de virtualização para ser utilizado por outra máquina virtual.
Se esse valor estiver consistentemente elevado em uma VM, pode existir contenção de CPU no host.
4. Encontrando processos que consomem CPU
O top já lista os processos ordenados por consumo de CPU.
Porém, podemos fazer uma consulta direta usando ps.
Para listar os processos que mais consomem CPU:
ps aux --sort=-%cpu | head
Para mostrar mais processos:
ps aux --sort=-%cpu | head -20
Uma saída pode ser:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
www-data 1234 85.2 0.7 512000 120000 ? R 10:30 2:15 php-fpm
mysql 2345 12.4 3.1 2048000 500000 ? S 09:20 15:42 mysqld
root 3456 8.2 0.2 100000 30000 ? S 10:00 0:30 apache2
Assim, conseguimos rapidamente identificar os processos mais consumidores.
5. Encontrando processos que consomem mais memória
Para ordenar os processos pelo uso de memória:
ps aux --sort=-%mem | head
Ou:
ps aux --sort=-%mem | head -20
Isso é bastante útil quando um servidor começa a utilizar swap ou apresenta sinais de falta de memória.
Por exemplo, podemos encontrar:
mysql 2345 12.4 18.5 ...
php-fpm 1234 8.2 10.3 ...
apache 3456 2.1 5.1 ...
Em um servidor web, isso pode ajudar a identificar rapidamente se o consumo está concentrado no PHP-FPM, Apache, banco de dados ou outro serviço.
6. Monitorando memória com free
Para analisar memória RAM, um dos comandos mais úteis é:
free -h
O parâmetro -h significa “human-readable”, apresentando os valores em unidades mais fáceis de interpretar.
Exemplo:
total used free shared buff/cache available
Mem: 15Gi 4.7Gi 2.1Gi 500Mi 8.9Gi 9.4Gi
Swap: 2.0Gi 0B 2.0Gi
Os campos mais importantes são:
total
Quantidade total de memória disponível.
used
Memória atualmente utilizada.
free
Memória completamente livre.
buff/cache
Memória utilizada pelo Linux para buffers e cache.
available
Estimativa de memória disponível para novos processos sem necessidade significativa de swap.
Este é um dos valores mais interessantes para avaliar a situação real da memória.
É importante entender que Linux utiliza memória RAM como cache.
Portanto, observar:
used: 90%
não significa automaticamente que existe um problema.
O sistema pode estar utilizando a RAM disponível como cache para melhorar o desempenho.
Um cenário muito mais preocupante seria encontrar:
availablemuito baixo;- swap sendo utilizada intensamente;
- processos sendo encerrados pelo OOM Killer;
- crescimento contínuo do consumo de memória.
7. Swap
Para verificar rapidamente o uso de swap:
free -h
Também podemos utilizar:
swapon --show
Ou:
cat /proc/swaps
A existência de swap não significa necessariamente que o servidor está com problema.
O ponto importante é observar se existe pressão constante de memória e movimentação intensa entre RAM e swap.
Em servidores, especialmente aqueles que utilizam banco de dados, aplicações web ou serviços de alto desempenho, uma utilização excessiva de swap pode causar degradação significativa.
8. O htop
O htop é uma alternativa mais amigável ao top.
Em distribuições Debian e Ubuntu, pode ser instalado com:
sudo apt install htop
Depois:
htop
A ferramenta apresenta uma interface interativa e facilita a visualização de:
- CPU por núcleo;
- memória;
- swap;
- processos;
- consumo de CPU;
- consumo de memória;
- árvore de processos.
Uma das vantagens do htop é permitir interagir diretamente com os processos.
Por exemplo, podemos:
- ordenar por CPU;
- ordenar por memória;
- pesquisar processos;
- visualizar a árvore de processos;
- enviar sinais para processos.
Para diagnóstico manual, é uma ferramenta extremamente prática.
9. Monitoramento com vmstat
O comando vmstat apresenta uma visão geral do sistema envolvendo processos, memória, swap, I/O e CPU.
Para executar uma atualização a cada segundo:
vmstat 1
Podemos limitar o número de atualizações:
vmstat 1 10
Nesse caso, o sistema será consultado a cada segundo, durante 10 ciclos.
Exemplo:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 2145300 500000 8900000 0 0 2 10 500 900 4 1 94 1
Alguns campos importantes:
r
Quantidade de processos aguardando acesso à CPU.
b
Processos bloqueados, normalmente aguardando algum recurso.
si
Memória sendo transferida da swap para a RAM.
so
Memória sendo transferida da RAM para a swap.
Valores altos e constantes de si e so podem indicar pressão de memória.
bi e bo
Operações de leitura e escrita relacionadas a I/O de blocos.
us, sy, id, wa
Indicadores de utilização da CPU.
O vmstat é especialmente interessante porque permite observar o sistema como um todo, em vez de olhar apenas para um processo específico.
10. Investigando problemas de disco com iostat
Às vezes, o servidor parece lento, mas CPU e memória estão normais.
Nesse caso, pode ser interessante verificar o armazenamento.
O comando iostat normalmente faz parte do pacote sysstat.
Em Debian e Ubuntu:
sudo apt install sysstat
Depois:
iostat
Para obter estatísticas mais detalhadas:
iostat -xz 1
O parâmetro 1 faz com que as informações sejam atualizadas a cada segundo.
O iostat pode ajudar a identificar situações em que o armazenamento está saturado.
Isso é especialmente útil em servidores que executam:
- MySQL;
- PostgreSQL;
- máquinas virtuais;
- servidores de arquivos;
- aplicações com grande volume de logs;
- sistemas que realizam muitas operações de leitura e escrita.
11. Atualização contínua com watch
O watch permite executar um comando repetidamente.
Por exemplo:
watch free -h
Isso atualiza a visualização da memória continuamente.
Podemos também acompanhar os processos que mais consomem CPU:
watch "ps aux --sort=-%cpu | head -10"
Ou memória:
watch "ps aux --sort=-%mem | head -10"
É uma solução simples para acompanhar uma situação sem necessariamente abrir o top ou htop.
12. Um pequeno kit de diagnóstico
Quando um servidor Linux apresenta lentidão, alguns comandos podem fornecer rapidamente uma boa visão do problema.
Ver carga do sistema
uptime
Monitoramento geral em tempo real
top
Interface mais amigável
htop
Ver memória
free -h
Processos que mais usam CPU
ps aux --sort=-%cpu | head -20
Processos que mais usam memória
ps aux --sort=-%mem | head -20
Monitorar CPU, memória e I/O
vmstat 1
Monitorar armazenamento
iostat -xz 1
Acompanhar qualquer comando
watch <comando>
13. Diagnóstico rápido na prática
Imagine que um usuário informe:
“O servidor está lento.”
O primeiro passo pode ser:
uptime
Depois:
free -h
Em seguida:
top
Se houver consumo elevado de CPU:
ps aux --sort=-%cpu | head -20
Se houver suspeita de falta de memória:
ps aux --sort=-%mem | head -20
Se CPU e memória parecerem normais:
vmstat 1
E, caso exista suspeita de armazenamento:
iostat -xz 1
Em poucos minutos, já é possível determinar se o problema provavelmente está relacionado a:
- CPU;
- memória;
- swap;
- processos específicos;
- I/O;
- armazenamento;
- ou simplesmente à carga normal do sistema.
Conclusão
O top continua sendo uma das ferramentas mais úteis para quem administra servidores Linux. Ele está disponível praticamente em qualquer instalação e permite obter rapidamente uma visão geral do sistema.
Porém, o diagnóstico fica muito mais eficiente quando utilizamos outras ferramentas em conjunto.
Uma combinação simples como:
top
free -h
ps
vmstat
iostat
já permite investigar uma grande quantidade de problemas relacionados a desempenho.
Mais importante do que memorizar dezenas de comandos é entender o que cada indicador representa.
Uma CPU com 100% de utilização pode ser perfeitamente normal em um processo de processamento intensivo. Da mesma forma, uma RAM aparentemente cheia pode ser apenas o Linux utilizando memória disponível para cache.
Por isso, o diagnóstico correto depende de analisar o conjunto: load average, CPU, memória disponível, swap, processos e I/O.
Com esse pequeno conjunto de ferramentas, é possível sair do clássico “o servidor está lento” e começar a responder uma pergunta muito mais útil:
“O que exatamente está deixando o servidor lento?”
E, no mundo Linux, essa diferença costuma economizar bastante tempo — e alguns reboots desnecessários.
