Go, les conteneurs et le planificateur Linux
(riverphillips.dev)- Applications Go dans des conteneurs : les développeurs Go déploient souvent leurs applications dans des conteneurs nécessitant des limites CPU afin d’éviter la monopolisation des ressources de l’hôte.
- Runtime Go et limites CPU : le runtime Go n’est pas intrinsèquement conscient des limites CPU d’un conteneur, ce qui peut entraîner une surutilisation et des problèmes de performances.
- Ramasse-miettes (GC) de Go : le GC de Go s’exécute de manière concurrente, mais de courtes pauses « stop-the-world » sont nécessaires à la fin du balayage et du marquage pour garantir l’intégrité des données.
- Planificateur Linux - CFS : le Completely Fair Scheduler (CFS) de Linux alloue le temps CPU de manière proportionnelle, et les processus reçoivent un temps CPU correspondant aux cœurs qui leur sont autorisés.
- Problème entre Go et CFS : Go crée un thread OS par cœur CPU, mais en ignorant les limites CPU du conteneur, il peut allonger les temps de GC « stop-the-world ».
- Configuration de
GOMAXPROCS: l’utilisation de la variable d’environnementGOMAXPROCSpermet d’aligner les threads OS de Go sur les limites CPU du conteneur et de réduire la latence du GC. - Automatisation de
GOMAXPROCS: la bibliothèqueautomaxprocsd’Uber peut configurer automatiquementGOMAXPROCSen fonction des limites du conteneur, ce qui simplifie la configuration. - Améliorations futures du runtime Go : une issue GitHub ouverte vise à intégrer la détection automatique des limites CPU dans le runtime Go.
Conclusion : pour utiliser efficacement les ressources et maintenir de bonnes performances des applications Go dans des conteneurs, il est important de configurer correctement les limites CPU et GOMAXPROCS.
1 commentaires
Avis sur Hacker News
--cpu-sharesGOMEMLIMITdans Go et d’un outil de configuration automatique de la limite mémoire (automemlimit)ko