2 puntos por GN⁺ 2023-11-09 | 1 comentarios | Compartir por WhatsApp
  • Aplicaciones de Go dentro de contenedores: Los desarrolladores de Go suelen desplegar aplicaciones en contenedores que necesitan límites de CPU para evitar acaparar los recursos del host.
  • Runtime de Go y límites de CPU: El runtime de Go no reconoce de forma inherente los límites de CPU del contenedor, lo que puede provocar uso excesivo y problemas de rendimiento.
  • Recolector de basura (GC) de Go: El GC de Go se ejecuta de forma concurrente, pero durante el fin del barrido y el fin del marcado necesita pausas breves de "detener el mundo" para mantener la integridad de los datos.
  • Planificador de Linux - CFS: El Completely Fair Scheduler (CFS) de Linux asigna tiempo de CPU de manera proporcional, y los procesos reciben tiempo de CPU equivalente a los núcleos permitidos.
  • Problemas entre Go y CFS: Go crea un hilo del SO por cada núcleo de CPU, pero al ignorar los límites de CPU del contenedor puede alargar los tiempos de "detener el mundo" del GC.
  • Configuración de GOMAXPROCS: Usar la variable de entorno GOMAXPROCS para alinear los hilos del SO de Go con los límites de CPU del contenedor puede reducir la latencia del GC.
  • Automatización de GOMAXPROCS: La biblioteca automaxprocs de Uber puede configurar automáticamente GOMAXPROCS según los límites del contenedor, simplificando la configuración.
  • Mejoras futuras en el runtime de Go: Existe un issue abierto en GitHub para integrar el reconocimiento automático de límites de CPU en el runtime de Go.

Conclusión: Para usar los recursos de forma eficiente y mantener el rendimiento de las aplicaciones de Go dentro de contenedores, es importante configurar correctamente los límites de CPU y GOMAXPROCS.

1 comentarios

 
GN⁺ 2023-11-09
Opiniones de Hacker News
  • Debate sobre usar reserva de CPU en lugar de límite de CPU en entornos de contenedores
  • Problema de detección incorrecta de la cantidad de núcleos por parte de aplicaciones dentro de contenedores
  • Explicación detallada de la configuración de Docker CFS cgroup y recomendación de usar --cpu-shares
  • Experiencia con problemas del planificador CFS dentro de contenedores y curiosidad por el nuevo planificador
  • Mención de la introducción de GOMEMLIMIT en Go y de la herramienta para establecer automáticamente límites de memoria (automemlimit)
  • Se comparten desafíos para gestionar límites de CPU en despliegues de Go dentro de clústeres de Kubernetes
  • Expresión de agradecimiento a la persona mantenedora de la herramienta ko por mencionar su proyecto
  • Pregunta sobre si el runtime de Go puede reconocer límites de CGroups y si otros runtimes se comportan de forma similar
  • Debate sobre reducir la latencia del GC realizando trabajo concurrente antes de llegar a puntos seguros
  • Mención de cómo el equipo de .NET CLR ajustó escenarios similares en entornos de contenedores