Go, los contenedores y el planificador de Linux
(riverphillips.dev)- 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 entornoGOMAXPROCSpara 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 bibliotecaautomaxprocsde Uber puede configurar automáticamenteGOMAXPROCSsegú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
Opiniones de Hacker News
--cpu-sharesGOMEMLIMITen Go y de la herramienta para establecer automáticamente límites de memoria (automemlimit)kopor mencionar su proyecto