Introdução
Compreender a gestão de processos e a monitorização de desempenho é essencial para manter sistemas saudáveis. Quando as aplicações abrandam ou os servidores deixam de responder, precisa de ferramentas e técnicas para diagnosticar problemas rapidamente. Este guia aborda abordagens práticas para monitorizar, resolver problemas e optimizar o desempenho do sistema Linux.
Monitorização de Processos
Comandos Básicos
# Listar todos os processos
ps aux
# Árvore de processos (relações pai-filho)
ps auxf
pstree -p
# Monitorização de processos em tempo real
top
htop # Alternativa mais amigável para o utilizador
# Filtrar por utilizador
ps -u username
# Filtrar por nome do processo
ps aux | grep nginx
pgrep nginx
Compreender a Saída do top/htop
top - 14:32:01 up 45 days, 2:15, 3 users, load average: 0.52, 0.58, 0.59
Tasks: 256 total, 1 running, 255 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.3 us, 1.2 sy, 0.0 ni, 93.1 id, 0.2 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 15842.3 total, 712.3 free, 7256.4 used, 7873.6 buff/cache
MiB Swap: 2048.0 total, 2040.0 free, 8.0 used. 8114.1 avail Mem
Métricas-chave:
- load average: carga de CPU nos últimos 1/5/15 minutos. Compare com o número de CPUs.
- us: tempo de CPU em espaço de utilizador
- sy: tempo de CPU do sistema/kernel
- id: tempo de CPU em idle
- wa: à espera de I/O
- buff/cache: memória usada para cache (disponível se necessário)
Atalhos do htop
| Tecla | Acção |
|---|
| F6 | Ordenar por coluna |
| F9 | Terminar processo |
| F4 | Filtrar por nome |
| t | Vista em árvore |
| H | Ocultar threads de utilizador |
| Space | Marcar processo |
Gestão de Memória
Utilização de Memória
# Resumo de memória
free -h
# Informação detalhada de memória
cat /proc/meminfo
# Memória por processo
ps aux --sort=-%mem | head -20
# Mapa de memória detalhado do processo
pmap <pid>
Compreender a Memória
total used free shared buff/cache available
Mem: 15Gi 7.1Gi 696Mi 416Mi 7.7Gi 7.9Gi
Swap: 2.0Gi 8.0Mi 2.0Gi
- available > free porque buff/cache pode ser recuperada
- buff/cache elevado é normal e bom (cache de leituras do disco)
- Vigie a memória available, não a free
Encontrar Fugas de Memória
# Monitorizar a memória do processo ao longo do tempo
while true; do
ps -o pid,vsz,rss,comm -p $(pgrep myapp)
sleep 60
done >> /var/log/memory-monitor.log
# Verificar se a memória do processo continua a crescer
watch -n 5 'ps -o pid,rss,command -p $(pgrep myapp)'
Gestão de CPU
Utilização de CPU por Processo
# Principais consumidores de CPU
ps aux --sort=-%cpu | head -20
# Utilização de CPU por core
mpstat -P ALL 1
# Monitorização de CPU em tempo real
htop
# Prima F2 → Opções de visualização → Assinale «Detailed CPU time»
Identificar Gargalos de CPU
# Verificar processos limitados por CPU
top
# Procurar processos com %CPU elevada
# Verificar espera de I/O
vmstat 1
# wa (wait) elevado indica gargalo de I/O, não de CPU
# strace ao processo para depuração
strace -c -p <pid> # Estatísticas de system calls
Monitorização de I/O de Disco
I/O em Tempo Real
# I/O por processo
iotop
iotop -oP # Apenas processos a fazer I/O
# Actividade do disco
iostat -xz 1
# Tempo de espera de I/O
vmstat 1
# Vigiar a coluna «wa»
Compreender o iostat
iostat -xz 1
Device r/s w/s rMB/s wMB/s %util
sda 45.00 120.00 1.80 48.00 85.00
- %util > 80%: o disco está a tornar-se um gargalo
- r/s, w/s: leituras e escritas por segundo
- await: tempo médio de espera (ms) — elevado = problema
Encontrar Ficheiros Grandes
# Encontrar ficheiros com mais de 1GB
find /var -type f -size +1G
# Utilização de disco por directório
du -sh /*
du -sh /var/*
# Utilização de disco interactiva
ncdu /var
Controlo de Processos
Sinais
# Terminação graciosa (SIGTERM)
kill <pid>
kill -15 <pid>
# Forçar terminação (SIGKILL)
kill -9 <pid>
# Terminar por nome
pkill nginx
killall nginx
# Enviar HUP (recarregar configuração)
kill -HUP <pid>
# Sinais comuns:
# SIGTERM (15): encerramento gracioso
# SIGKILL (9): forçar terminação (não pode ser interceptado)
# SIGHUP (1): hangup/recarregar
# SIGSTOP (19): pausar processo
# SIGCONT (18): retomar processo
Prioridade de Processo
# Iniciar com prioridade mais baixa (nicer)
nice -n 10 ./long-running-script.sh
# Alterar a prioridade de um processo em execução
renice -n 10 -p <pid>
# Intervalo de prioridade: -20 (mais alta) a 19 (mais baixa)
# Apenas o root pode definir valores nice negativos
Processos em Segundo Plano
# Executar em segundo plano
./script.sh &
# Mover o processo actual para segundo plano
Ctrl+Z # Suspender
bg # Retomar em segundo plano
# Trazer para primeiro plano
fg
# Listar jobs em segundo plano
jobs
# Manter em execução após logout
nohup ./script.sh &
# A saída vai para nohup.out
# Ou usar disown
./script.sh &
disown %1
Limites de Recursos do Sistema
Ver Limites
# Limites da shell actual
ulimit -a
# Limites do processo
cat /proc/<pid>/limits
Definir Limites
# Temporário (sessão actual)
ulimit -n 65535 # Máximo de ficheiros abertos
# Permanente: /etc/security/limits.conf
# <user> <type> <item> <value>
www-data soft nofile 65535
www-data hard nofile 65535
* soft nproc 4096
Ferramentas de Monitorização
vmstat - Estatísticas de Memória Virtual
vmstat 1
# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
# r b swpd free buff cache si so bi bo in cs us sy id wa st
# 1 0 0 712340 125612 7935460 0 0 1 45 102 234 5 1 93 1 0
- r: processos em execução (> CPUs = sobrecarga)
- b: processos bloqueados (à espera de I/O)
- si/so: swap in/out (deveria ser 0)
- bi/bo: I/O de bloco
sar - System Activity Reporter
# Instalar sysstat para o sar
sudo apt install sysstat
# Histórico de CPU
sar -u
# Histórico de memória
sar -r
# Histórico de I/O de disco
sar -d
# Histórico de rede
sar -n DEV
dstat - Estatísticas Abrangentes
# Instalar
sudo apt install dstat
# Monitorização tudo-em-um
dstat -cdngy
# CPU, disco, rede, paging, sistema
Fluxos de Trabalho de Resolução de Problemas
Utilização Elevada de CPU
# 1. Identificar o processo
top -c
# Anotar o PID do processo com CPU elevada
# 2. Verificar o que está a fazer
strace -p <pid> 2>&1 | head -50
# 3. Verificar se está a usar todos os cores
mpstat -P ALL 1
# 4. Fazer profiling se necessário (para as suas próprias apps)
perf top -p <pid>
Utilização Elevada de Memória
# 1. Verificar a memória global
free -h
# 2. Encontrar os maiores consumidores de memória
ps aux --sort=-%mem | head -10
# 3. Verificar fugas de memória
pmap <pid> | tail -1
# 4. Limpar caches (se necessário, normalmente não)
sync; echo 3 > /proc/sys/vm/drop_caches
Sistema Sem Resposta
# 1. Verificar o load average
uptime
# 2. Verificar espera de I/O
vmstat 1
# 3. Verificar falta de memória (out of memory)
dmesg | tail -50 | grep -i "out of memory"
# 4. Verificar utilização de swap
free -h
swapon --show
# 5. Verificar espaço em disco
df -h
Logging e Persistência
Tornar Persistentes os Logs do journald
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
Ver Logs de Arranques Anteriores
# Listar arranques
journalctl --list-boots
# Ver arranque específico
journalctl -b -1 # Arranque anterior
journalctl -b -2 # Há dois arranques
# Ver avisos e erros
journalctl -p warning
journalctl -b -1 -p err
A Mentalidade de Resolução de Problemas Sénior: Primeiros 60 Segundos
Quando faz SSH para um servidor em chamas, execute estes comandos por esta ordem:
# 1. Load averages — está a aumentar ou a diminuir?
uptime
# 2. Erros do kernel — OOM kills, erros de I/O de disco?
dmesg | tail
# 3. Vista global do sistema — processos, memória, swap, CPU
vmstat 1
# 4. Equilíbrio de CPU entre cores — há um core no máximo?
mpstat -P ALL 1
# 5. Que processo está a causar a carga?
pidstat 1
# 6. Latência e saturação do disco
iostat -xz 1
# 7. Utilização de memória e cache
free -m
# 8. Throughput de rede
sar -n DEV 1
# 9. Falhas/retransmissões de ligações TCP
sar -n TCP,ETCP 1
# 10. A visão geral clássica
top
Diagnóstico Rápido: CPU Alta Mas Baixo Tempo de Utilizador?
Se a CPU estiver alta mas us (espaço de utilizador) estiver baixo:
sy (system) alto: demasiadas mudanças de contexto. Verifique se há demasiadas threads/processos.wa (wait) alto: gargalo de I/O de disco, não de CPU.in (interrupts) alto: placa de rede ou interrupções de hardware.
Emergência de Descritores de Ficheiro
«Too many open files» (EMFILE) faz a produção falhar. Verificação e correcção rápidas:
# Verificar limites actuais
ulimit -Sn # Limite soft (pode ser aumentado)
ulimit -Hn # Limite hard (teto)
# Para um processo específico
cat /proc/<pid>/limits | grep "open files"
# Contar ficheiros abertos actualmente
ls /proc/<pid>/fd | wc -l
Correcção permanente em /etc/security/limits.conf:
* soft nofile 200000
* hard nofile 500000
Verificação de Saturação de I/O de Disco
Se iostat -xz 1 mostrar %util > 80%, o disco está saturado.
Perguntas rápidas: 1. Quem está a escrever? → iotop 2. É aleatório ou sequencial? → IOPS alto com baixo throughput = aleatório
- O disco está a falhar? → Verifique
dmesg | tail para erros
Benchmark rápido do disco:
# Velocidade de escrita (contornar a cache)
dd if=/dev/zero of=testfile bs=1M count=1024 oflag=dsync
Conclusão
Uma gestão eficaz de processos e desempenho exige compreender as métricas do sistema e ter as ferramentas certas prontas. Use htop para monitorização interactiva, vmstat e iostat para identificar gargalos, e conheça os seus sinais para controlo de processos. Engenheiros sénior isolam recursos de forma sistemática (CPU, RAM, Disco, Rede) em vez de adivinhar ao acaso. A monitorização regular ajuda a detectar problemas antes de se tornarem críticos.