Compilar, Testar e Analisar Desempenho (Profile) a partir do Shell
Execute compilações e testes a partir do shell, capture perfis com go tool pprof e alinhe falhas com timestamps do journalctl em hosts Linux.
Busque em todas as páginas da documentação
Execute compilações e testes a partir do shell, capture perfis com go tool pprof e alinhe falhas com timestamps do journalctl em hosts Linux.
A toolchain do Go é nativa para CLI: go build, go test e go tool pprof são projetados para scripts, CI e sessões SSH.
Combine-os com redirecionamento de shell, tee e consultas de journal para que um teste falho no seu laptop use os mesmos comandos que você executará durante um incidente de produção.
Cartão de receita de referência rápida - pronto para copiar e colar.
# Compilar e testar a partir da raiz do módulo
go build -o bin/api ./cmd/api
go test ./... -count=1 -race 2>&1 | tee test.log
# Analisar CPU de um benchmark localmente
go test -bench=. -benchmem -cpuprofile=cpu.prof -run=^$ ./...
go tool pprof -http=:0 cpu.prof
# Buscar perfil de um servidor em execução (quando o endpoint pprof está habilitado)
curl -s "http://localhost:6060/debug/pprof/profile?seconds=30" -o live.prof
go tool pprof live.prof
# Correlacionar com logs do systemd
sudo journalctl -u api.service --since "10 min ago" --no-pagerQuando usar isso:
go test com os timestamps do journal.#!/usr/bin/env bash
set -euo pipefail
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
# Compilar
mkdir -p bin
go build -ldflags="-s -w" -o bin/api ./cmd/api
# Testar com detector de race; manter artefato de log
go test ./... -count=1 -race -timeout=5m 2>&1 | tee artifacts/test-$(date +%Y%m%d%H%M).log
# Micro-benchmark + perfil de CPU para um pacote
PKG=./internal/handler
go test "$PKG" -bench=BenchmarkHealth -benchmem \
-cpuprofile=artifacts/cpu.prof -run=^$ -count=1
go tool pprof -top artifacts/cpu.prof | head -20
# Se api.service estiver em execução neste host, buscar linhas recentes do journal
if systemctl is-active --quiet api.service 2>/dev/null; then
journalctl -u api.service --since "15 min ago" -n 200 --no-pager \
| tee artifacts/api.journal.snippet
fiO que isso demonstra:
go test ./... habilitado para race, adequado para paridade de CI.journalctl capturado ao lado da saída do teste para cadernos de incidentes.go build compila pacotes; -o nomeia o binário de saída e -ldflags injeta metadados de versão ou remove símbolos de depuração.go test executa arquivos _test.go; flags como -race, -count=1 e -timeout mapeiam diretamente para o YAML da CI.go test -cpuprofile e -memprofile anexam amostragem do runtime/pprof durante testes ou benchmarks.go tool pprof lê arquivos de perfil ou URLs e pode abrir uma interface web local (-http) para flame graphs./debug/pprof/* quando você importa net/http/pprof e escuta em uma porta de depuração (proteja em produção).journalctl lê o journal do systemd; filtrar por unidade e intervalo de tempo coloca traces Go ao lado de eventos OOM ou de reinício.go test| Flag | Propósito |
|---|---|
./... | Todos os pacotes sob a raiz do módulo |
-race | Detector de race (CI para pacotes Go puros) |
-count=1 | Desativar cache de teste |
-run=^$ | Pular testes; apenas benchmarks |
-bench=. | Executar benchmarks que correspondem à regex |
-cpuprofile=file | Escrever perfil de CPU |
-memprofile=file | Escrever perfil de heap |
-json | Eventos de teste legíveis por máquina (Go 1.20+) |
pprof| Fonte | Comando |
|---|---|
| Teste/benchmark | go test -cpuprofile=cpu.prof |
| Servidor local | curl localhost:6060/debug/pprof/profile?seconds=30 |
| Pod K8s | kubectl port-forward pod/api 6060:6060 e depois curl |
| Análise de arquivo | go tool pprof -http=:0 cpu.prof |
// cmd/api/main.go - listener de depuração opcional (apenas staging)
import _ "net/http/pprof"
go func() {
log.Println(http.ListenAndServe("127.0.0.1:6060", nil))
}()Vincule ao loopback, proteja com autenticação ou política de rede antes de expor além do localhost.
hey, k6 ou testes de integração enquanto analisa.pprof em :6060 público - Atacantes escaneiam portas pprof abertas. Correção: vincule a 127.0.0.1, use port-forward ou restrinja com autenticação.go test -count=1 na CI e ao depurar instabilidades.-tags consistentemente.go test ./... - Falhas rolam para fora da tela no tmux. Correção: sempre use tee para um arquivo e rg FAIL depois.journalctl usa o horário local por padrão; a UTC da CI é diferente. Correção: passe --utc ou anote os deslocamentos na documentação do incidente.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Runner de teste IDE | Loop interno rápido enquanto edita | Você precisa da transcrição exata do comando da CI |
Wrapper make test | Flags e artefatos padrão da equipe | Ele oculta flags que novos contratados nunca aprendem |
| Profiling contínuo (Parca, Pyroscope) | Histórico de produção sempre ativo | Você só precisa de um benchmark local único |
perf / bpftrace | Problemas em nível de kernel ou syscall | Hotspots de CPU do Go geralmente são suficientes no espaço do usuário |
| Profiler do provedor de nuvem | Integração gerenciada GCP/AWS | Política de dependência mínima ou air-gapped |
Por pacote enquanto itera; ./... completo antes do push e na CI.
Use -run TestName para refinar ainda mais.
Relativo ao diretório do pacote em teste, a menos que você passe um caminho absoluto.
Colete-os em artifacts/ em scripts para evitar sujar as árvores git.
15-30 segundos é típico para serviços HTTP sob carga constante.
Amostras mais curtas funcionam para benchmarks rápidos.
Sim.
Use -memprofile, ou curl .../debug/pprof/heap e go tool pprof -top no perfil de heap.
Mensagens do kernel, razões de reinício do systemd e metadados da unidade na mesma linha do tempo dos seus logs Go quando o stdout vai para o journal.
Padrão forte para serviços sem CGO pesado.
Orce tempo extra e pule apenas com exceções documentadas.
go tool pprof -base=old.prof new.prof destaca as diferenças após um branch de otimização.
Sim.
Ferramentas como gotestsum e filtros jq personalizados consomem eventos JSON para anotações de CI.
Binários menores para imagens de contêiner.
Mantenha compilações não removidas para simbolização de crash interna se você não tiver informações de depuração separadas.
Defina GODEBUG=gctrace=1 ou use benchmarks de teste que envolvam o caminho crítico; CLIs geralmente são analisados melhor em testes unitários do que via pprof HTTP.
O processo provavelmente não teve amostras durante a janela.
Aumente a carga ou estenda o parâmetro de consulta seconds=.
journalctl -u api.service -g panic busca o texto da mensagem.
Exporte uma janela para um arquivo e use rg para frames de pilha como backup.
tee e pipe de logsVersões da Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026