Go, Container und der Linux-Scheduler
(riverphillips.dev)- Go-Anwendungen in Containern: Go-Entwickler stellen ihre Anwendungen häufig in Containern bereit, die CPU-Limits benötigen, um die exklusive Nutzung von Host-Ressourcen zu verhindern.
- Go-Runtime und CPU-Limits: Die Go-Runtime erkennt CPU-Limits von Containern nicht von Haus aus, was zu übermäßiger Nutzung und Leistungsproblemen führen kann.
- Go Garbage Collector (GC): Der GC von Go läuft gleichzeitig, benötigt aber während Sweep-Termination und Mark-Termination kurze „Stop-the-World“-Pausen, um die Datenintegrität sicherzustellen.
- Linux-Scheduler – CFS: Der Completely Fair Scheduler (CFS) von Linux weist CPU-Zeit proportional zu, und Prozesse erhalten CPU-Zeit entsprechend den ihnen erlaubten Kernen.
- Probleme zwischen Go und CFS: Go erstellt einen OS-Thread pro CPU-Kern, ignoriert dabei jedoch das CPU-Limit des Containers, wodurch sich die GC-„Stop-the-World“-Zeiten verlängern können.
GOMAXPROCSkonfigurieren: Mit der UmgebungsvariableGOMAXPROCSlassen sich die OS-Threads von Go an das CPU-Limit des Containers anpassen, um GC-Latenzen zu verringern.- Automatisierung von
GOMAXPROCS: Ubers BibliothekautomaxprocskannGOMAXPROCSautomatisch auf Basis der Container-Limits setzen und so die Konfiguration vereinfachen. - Künftige Verbesserungen der Go-Runtime: Es gibt ein offenes GitHub-Issue, um die automatische Erkennung von CPU-Limits direkt in die Go-Runtime zu integrieren.
Fazit: Für eine effiziente Ressourcennutzung und stabile Leistung von Go-Anwendungen in Containern ist es wichtig, CPU-Limits und GOMAXPROCS passend zu konfigurieren.
1 Kommentare
Hacker-News-Kommentare
--cpu-sharesGOMEMLIMITin Go sowie des Tools zur automatischen Speicherlimit-Setzung (automemlimit)ko-Tools für die Erwähnung des Projekts