Práticas Recomendadas de Runtime e GC
Fluxo de trabalho de ajuste de produção com métricas e testes de carga.
Busque em todas as páginas da documentação
Fluxo de trabalho de ajuste de produção com métricas e testes de carga.
Estas regras destilam a seção Runtime & GC: meça primeiro, ajuste os parâmetros com margem e corrija os retentores antes de buscar micro-otimizações.
gctrace e pprof.GOGC, GOMEMLIMIT, hotspots de alocação) por experimento.alloc_space e inuse_space sob carga real. Conheça os principais alocadores antes de alterar GOGC./gc/cpu:fraction-of-cpu-time e go_memstats_heap_alloc_bytes. Alerte sobre desvios sustentados, não picos únicos.NumGoroutine e StackInuse com a taxa de requisição. Separe vazamentos de heap do crescimento da pilha de goroutines.GODEBUG=gctrace=1 durante testes de carga. Armazene a saída com tags de implantação para comparação.go test -bench com benchmem em pacotes intensivos. Capture regressões de alocação em CI.GOMEMLIMIT para ~85-90% do limite de memória do pod. Deixe margem para pilhas e memória fora do heap.GOMAXPROCS com o limite de CPU quando não for automático. Evite throttling invisível com Ps em excesso.FreeOSMemory pós-pico apenas após trabalhos em lote raros. Não é um substituto para correções de vazamentos.GOMEMLIMIT em vez de GOGC baixo agressivo no Kubernetes. A escassez de CPU prejudica a latência mais do que os limites flexíveis ajudam.GOGC apenas com métricas p99 e gc_cpu antes e depois. Um parâmetro por canary.GOGC=off fora de benchmarks isolados. Documente qualquer exceção com limites de tempo.debug.SetGCPercent se usadas dinamicamente. Raro, observável, reversível.make intensivos antes de ajustar o GC. A taxa de alocação impulsiona a CPU de marcação.go build -gcflags="-m" em caminhos intensivos comprovados. Verifique se os escapes correspondem às expectativas.sync.Pool apenas para buffers temporários de curta duração. Nunca agrupe objetos com estado oculto.map de nível de pacote ilimitados.time.After em loops por timers reutilizáveis. Evite vazamentos de heap de timers.context.Context e selecione em Done() em loops. Evite vazamentos de goroutines paradas.Shutdown(ctx) com timeout limitado ao parar HTTP/gRPC. Esvazie workers antes de sair.Close() explícito em vez de runtime.SetFinalizer para handles. Finalizadores são apenas para diagnóstico.Gauge de alocação de heap, contagem de goroutines, fração de CPU do GC e RSS do processo.
Adicione captura de gctrace em testes de carga antes de alterar os parâmetros.
Sim para implantações com limite de cgroup (Kubernetes, Cloud Run, ECS).
Bare-metal com RAM suficiente pode confiar nos padrões inicialmente, mas ainda deve medir.
Quando você tem margem de CPU e precisa reduzir o heap máximo para colocation ou outliers de latência ligados a heaps grandes.
Valide com testes de carga.
O Green Tea reduz a CPU de marcação para muitos fluxos de trabalho no Go 1.26.
Refaça o perfil após a atualização; a estratégia de parâmetros permanece a mesma.
Passos para capturar perfis de heap e goroutine, gráfico de NumGoroutine, diff de implantação recente, configuração de cache e GOGC/GOMEMLIMIT de ambiente atuais.
Não.
Adiciona ruído de latência e esconde vazamentos temporariamente.
Use trabalhos de diagnóstico dedicados em vez disso.
Frameworks não alteram a mecânica do GC.
Seus padrões de middleware afetam a vida útil da goroutine e as alocações com escopo de requisição - profile seus handlers.
Controladores de longa duração vazam muito sem cancelamento de ctx e Stop em informers.
Aplique limites de goroutine e cache agressivamente em operadores.
A cada atualização menor do Go, mensalmente para serviços de nível 1 e após qualquer alteração em caches ou limites de concorrência.
Parcialmente.
Combine bodyclose, noctx, govet e o detector de corrida em CI com métricas de runtime.
Linters não substituem perfis.
Versões de Stack: Esta página foi escrita para Go 1.26.x (Green Tea GC padrão, 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