Prácticas recomendadas de tiempo de ejecución y GC
Flujo de trabajo de optimización de producción con métricas y pruebas de carga.
Busca en todas las páginas de la documentación
Flujo de trabajo de optimización de producción con métricas y pruebas de carga.
Estas reglas resumen la sección de Tiempo de ejecución y GC: mida primero, ajuste las perillas con margen y corrija los retenedores antes de perseguir microoptimizaciones.
gctrace y pprof.GOGC, GOMEMLIMIT, puntos críticos de asignación) por experimento.alloc_space e inuse_space bajo carga real. Conozca los principales asignadores antes de cambiar GOGC./gc/cpu:fraction-of-cpu-time y go_memstats_heap_alloc_bytes. Alerte sobre desviaciones sostenidas, no sobre picos únicos.NumGoroutine y StackInuse con la tasa de solicitudes. Separe las fugas de memoria del crecimiento de la pila de goroutines.GODEBUG=gctrace=1 durante las pruebas de carga. Almacene la salida con etiquetas de implementación para su comparación.go test -bench con benchmem en paquetes activos. Detecte regresiones de asignación en CI.GOMEMLIMIT en aproximadamente el 85-90% del límite de memoria del pod. Deje margen para pilas y memoria fuera de montón.GOMAXPROCS con el límite de CPU cuando no sea automático. Evite el estrangulamiento invisible con Ps excesivos.FreeOSMemory posterior al pico solo después de trabajos por lotes poco frecuentes. No es un sustituto de las correcciones de fugas.GOMEMLIMIT sobre un GOGC bajo agresivo en Kubernetes. La inanición de CPU daña la latencia más de lo que ayudan los límites blandos.GOGC solo con métricas de CPU gc y p99 antes y después. Una perilla por canary.GOGC=off fuera de los benchmarks aislados. Documente cualquier excepción con límites de tiempo.debug.SetGCPercent si se usan dinámicamente. Raros, observables, reversibles.make activos antes de optimizar el GC. La tasa de asignación impulsa la CPU de marcado.go build -gcflags="-m" en rutas activas probadas. Verifique que los escapes coincidan con las expectativas.sync.Pool solo para búferes temporales de corta duración. Nunca agrupe objetos con estado oculto.map sin límites.time.After en bucles con temporizadores reutilizables. Evite fugas en el montón de temporizadores.context.Context y seleccione Done() en bucles. Evite fugas de goroutines en pausa.Shutdown(ctx) con un tiempo de espera limitado al detener HTTP/gRPC. Drene los trabajadores antes de salir.Close() explícito sobre runtime.SetFinalizer para manejadores. Los finalizadores son solo para diagnóstico.Indicador de asignación de montón, recuento de goroutines, fracción de CPU del GC y RSS del proceso.
Agregue la captura de gctrace en las pruebas de carga antes de cambiar las perillas.
Sí, para implementaciones con límites de cgroup (Kubernetes, Cloud Run, ECS).
El metal desnudo con RAM abundante puede depender de los valores predeterminados inicialmente, pero aún así debe medir.
Cuando tiene margen de CPU y debe reducir el montón máximo para la colocalización o los valores atípicos de latencia vinculados a montones grandes.
Valide con pruebas de carga.
Green Tea reduce la CPU de marcado para muchas cargas de trabajo en Go 1.26.
Vuelva a perfilar después de la actualización; la estrategia de perillas sigue siendo la misma.
Pasos para capturar perfiles de montón y goroutine, gráfico de NumGoroutine, diferencia de implementación reciente, configuración de caché y GOGC/GOMEMLIMIT de entorno actuales.
No.
Agrega ruido de latencia y oculta fugas temporalmente.
Utilice trabajos de diagnóstico dedicados en su lugar.
Los frameworks no cambian la mecánica del GC.
Sus patrones de middleware afectan la vida útil de las goroutines y las asignaciones específicas de la solicitud: genere perfiles de sus manejadores.
Los controladores de larga duración tienen fugas graves sin la cancelación de ctx y Stop en los informadores.
Aplique límites de goroutine y caché agresivamente en los operadores.
Cada actualización menor de Go, mensualmente para servicios de nivel 1 y después de cualquier cambio en las cachés o límites de concurrencia.
Parcialmente.
Combine bodyclose, noctx, govet y el detector de carreras de CI con métricas de tiempo de ejecución.
Los linters no reemplazan los perfiles.
Versiones de pila: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, go fix modernizers - verifique el parche en la compilación), chi (última versión - verifique en la compilación), gin (última versión - verifique en la compilación), echo (última versión - verifique en la compilación), google.golang.org/grpc (última versión - verifique en la compilación), sigs.k8s.io/controller-runtime (última versión - verifique en la compilación), kubebuilder (última versión - verifique en la compilación), tinygo (última versión - verifique los objetivos de la placa en la compilación), wazero (última versión - verifique en la compilación) y golangci-lint (última versión - verifique el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026