MÓDULO 01 · CONCEITO 05 DE 8

Linux para devs — ferramentas que salvam produção

As ferramentas que distinguem quem investiga de quem chuta.

Tempo de leitura ~20 min Pré-requisito Rede aplicada Próximo Containers em profundidade

Em algum momento, você vai estar diante de um app em produção que está "lento", "travando", ou "caindo sem motivo aparente". Aplicações modernas têm muitas camadas, e o problema raramente está onde você esperaria. Quem já passou por isso sabe a diferença entre dois cenários: você abre uma janela de terminal, executa cinco comandos, e em três minutos sabe exatamente o que está acontecendo; ou você passa duas horas chutando, vendo logs que não dizem nada, antes de chamar alguém que sabe. A diferença não é experiência mística — é conhecimento de um conjunto pequeno de ferramentas Linux e do que cada uma revela.

Este conceito não é tutorial completo de cada ferramenta — referências no final cobrem isso. É catálogo operacional: para cada sintoma, quais ferramentas usar e o que esperar delas. Se você internalizar esse mapa, as próximas crises serão muito mais curtas. E mesmo fora de crises, esses comandos viram cotidianos — entender o que está acontecendo no servidor é parte do trabalho de quem opera o que constrói.

O conjunto essencial

top e htop — visão geral em tempo real

A primeira coisa a olhar quando algo está estranho. Mostra processos ordenados por consumo (CPU ou memória), uso total do sistema, load average, threads. htop é a versão moderna com cores, hierarquia visual de processos, e teclas para filtrar/ordenar interativamente.

O que procurar:

ps — snapshot de processos

Diferente de top, ps dá um snapshot. Útil para scripts e investigação focada. ps aux é o comando que todo mundo decora: lista todos os processos com detalhes. ps -ef tem layout um pouco diferente. ps --tree mostra hierarquia pai-filho — útil para entender quem criou quem.

Combinações comuns:

# Top 10 por CPU
ps aux --sort=-%cpu | head

# Top 10 por memória
ps aux --sort=-%mem | head

# Encontrar processo por nome
ps -ef | grep -i nginx

# Threads de um processo
ps -L -p <pid>

ss — estado de sockets

Substituiu netstat (que ainda existe mas é considerado legado). Mostra todas as conexões TCP/UDP, suas estados, processos donos. Indispensável para qualquer problema de rede.

# Todos os sockets TCP estabelecidos com PIDs
ss -tnp

# Sockets em LISTEN (servidores)
ss -tlnp

# Resumo geral de estados
ss -s

# Filtros: conexões para porta 80
ss -tn dport = :80

Útil para descobrir: que processo está ouvindo em que porta? quantos sockets em TIME_WAIT estão acumulando? quais hosts a máquina está conversando agora? quais conexões estão em CLOSE_WAIT (sintoma de cleanup ruim)?

lsof — list open files

Em Linux, "tudo é arquivo" — incluindo sockets de rede, pipes, dispositivos. lsof lista tudo o que está aberto. Para um processo específico:

# Tudo o que o processo <pid> tem aberto
lsof -p <pid>

# Quem está ouvindo na porta 80
lsof -i :80

# Quem tem o arquivo /var/log/app.log aberto
lsof /var/log/app.log

# Procurar leak de FD
lsof -p <pid> | wc -l   # crescente ao longo do tempo = leak

strace — system calls em tempo real

Já mencionado no conceito 03. strace -p <pid> mostra cada syscall que um processo está fazendo. Diagnóstico definitivo para "o que esse processo está tentando fazer?". Caro (desacelera processo), use com critério em produção.

# Tudo
strace -p <pid>

# Só syscalls de arquivo
strace -e trace=openat,read,write -p <pid>

# Só rede
strace -e trace=network -p <pid>

# Com timestamps relativos
strace -tt -p <pid>

# Iniciar com o programa (mais útil em dev)
strace -e trace=openat ./meu_programa

tcpdump — captura de pacotes

Para problemas de rede que ferramentas de mais alto nível não esclarecem. Captura pacotes da interface, mostra ou salva para análise posterior (Wireshark abre arquivos pcap).

# Capturar tráfego HTTP
sudo tcpdump -i eth0 -nn 'port 80'

# Capturar e salvar para Wireshark
sudo tcpdump -i any -w captura.pcap 'host 192.168.1.50'

# Mostrar conteúdo (texto não-binário)
sudo tcpdump -i any -A 'port 80'

Em containers Kubernetes, capturar o tráfego de um pod específico envolve entrar no namespace de rede dele — ferramentas como kubectl debug ou nsenter ajudam.

journalctl — logs do systemd

Em sistemas com systemd (Ubuntu, Debian, RHEL, Fedora modernos), todos os logs centralizam em journald. journalctl é a ferramenta para consultar.

# Logs de uma unidade
journalctl -u nginx.service

# Tail contínuo
journalctl -u nginx.service -f

# Desde determinada hora
journalctl -u nginx.service --since "2 hours ago"

# Apenas erros
journalctl -u nginx.service -p err

# Logs do kernel (incluindo OOM kills)
journalctl -k

dmesg — buffer do kernel

Mensagens do kernel: hardware, OOM kills, drivers, problemas de filesystem. Quando o sistema operacional tem algo a dizer, é aqui. dmesg -T adiciona timestamps; dmesg -w faz tail.

OOM kills (Out Of Memory) aparecem aqui antes de em qualquer outro lugar:

$ dmesg | grep -i 'killed process'
[12345.678] Out of memory: Killed process 1234 (java) total-vm:8GB...

vmstat, iostat, mpstat — performance

Trio para diagnosticar onde está o gargalo do sistema:

perf — profiling de produção

Profiling no nível do sistema operacional. Pode atachar a processos vivos sem instrumentação prévia. Para diagnosticar "este processo está em 100% CPU mas eu não sei fazendo o quê":

# Sample por 30 segundos
sudo perf record -F 99 -p <pid> -g -- sleep 30

# Ver report
sudo perf report

# Flame graph (com Brendan Gregg's tools)
sudo perf script | flamegraph.pl > flame.svg

Brendan Gregg, em Systems Performance, codificou um catálogo de uso de perf que vale conhecer. Flame graphs em particular são a ferramenta visual mais informativa para análise de hot paths.

O método USE de Brendan Gregg

Quando você não sabe por onde começar, o método USE oferece um checklist sistemático. Para cada recurso (CPU, memória, disco, rede), verifique três coisas:

Para CPU: top (utilization), load average (saturation), dmesg (errors). Para memória: free -h (utilization), swap (saturation), dmesg | grep oom (errors). Para disco: iostat -x (todos os três). Para rede: ss -s, nstat, contadores de erro de interface em ip -s link.

A elegância do método é que ele força você a olhar tudo, em ordem, em vez de pular para a primeira hipótese. Em incidentes, a primeira hipótese costuma estar errada — porque é viesada pelo que você acabou de tocar ("commitei agora então é meu código"). USE é antiviés.

Padrões de diagnóstico — sintoma → ferramenta

Tabela mental para você acessar quando o pager apita:

Ferramentas modernas e BPF

Os comandos clássicos têm complementos modernos baseados em eBPF (extended Berkeley Packet Filter), tecnologia Linux que permite executar pequenos programas sandboxed dentro do kernel. A coleção bcc-tools e o framework bpftrace dão acesso a observabilidade de baixo nível com overhead muito menor que ferramentas antigas:

eBPF é o futuro de observabilidade Linux. Cilium, Pixie, Falco, Hubble — muitas ferramentas modernas se baseiam nele. Hoje você não precisa escrever programas BPF na mão; apenas saber que essa camada existe e que ferramentas tipo bcc dão acesso fácil.

Editor de fluxo de texto — sed, awk, jq

Logs e dados estruturados aparecem em todo lugar. Saber massagear texto na linha de comando economiza muito tempo:

Pipeline canônico para "top 10 IPs em log Nginx":

cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head

Como praticar

Não decore comandos — use-os. A familiaridade vem de aplicar em situações reais. Três exercícios:

  1. Investigue um app que você não conhece. Suba qualquer coisa (Nginx, Postgres, um app teu). Use o método USE para descrevê-lo completamente: quanto consome de CPU/mem/disk/net, que portas escuta, que processos filhos tem, quais arquivos tem aberto. Não tem objetivo — é treino.
  2. Provoque um problema e diagnostique. Suba um servidor que vaza FDs em loop. Use lsof e watch -n 1 'lsof -p PID | wc -l' para ver o número crescer. Quando o servidor cair, identifique a causa nos logs.
  3. Capture e analise tráfego. Use tcpdump para capturar o tráfego de uma curl contra um servidor seu. Abra no Wireshark. Identifique handshake TCP, handshake TLS, request HTTP, response. Cada parte deveria ser identificável visualmente.

Referências para aprofundar

  1. livro Systems Performance: Enterprise and the Cloud (2nd ed.) — Brendan Gregg (2020). Bíblia de performance Linux. Método USE, ferramentas, casos. Releitura ao longo da carreira.
  2. livro BPF Performance Tools — Brendan Gregg (2019). Continuação focada em eBPF. Para quem quer adotar a próxima geração de observabilidade.
  3. livro The Linux Command Line (2nd ed.) — William Shotts (2019). linuxcommand.org/tlcl.php — gratuito online. Excelente para preencher gaps de uso cotidiano da CLI.
  4. livro Linux System Programming (2nd ed.) — Robert Love (2013). Para entender o que está embaixo dos comandos. Capítulos sobre processos, I/O e memória são especialmente úteis.
  5. artigo Linux Performance Tools — Brendan Gregg. brendangregg.com/linuxperf.html — diagrama mítico que mapeia ferramentas a subsistemas. Imprima e cole na parede.
  6. artigo Linux Performance: USE Method — Brendan Gregg. brendangregg.com/usemethod.html — checklist por recurso. Salva-vidas em incidentes.
  7. artigo What does my computer do all day? — Julia Evans. jvns.ca — série de explicações curtas sobre processos, memória, redes em Linux. Perfeita para consumir aos poucos.
  8. docs Linux man pages. man7.org — referência oficial. Aprenda man -k para busca por keyword e man N comando para seções específicas.
  9. docs tldr pages. tldr.sh — exemplos práticos de comandos quando man é denso demais. Acessível via tldr COMANDO.
  10. docs BCC Tutorial. github.com/iovisor/bcc/blob/master/docs/tutorial.md — lista de tools eBPF prontas. Cada uma resolve um problema específico.
  11. vídeo USENIX LISA — Linux Performance Tools — Brendan Gregg. YouTube. 90 minutos densos cobrindo o catálogo inteiro com casos reais. Material formativo.
  12. vídeo Wizard Zines — Julia Evans. wizardzines.com — zines em PDF/print sobre Linux, debugging, redes. Pequenas, ilustradas, formativas.