Monitorando CPU e Memória no Linux: top e outros comandos essenciais

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:

  • available muito 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.

Rolar para cima