2 Punkte von GN⁺ 2023-11-09 | 1 Kommentare | Auf WhatsApp teilen
  • 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.
  • GOMAXPROCS konfigurieren: Mit der Umgebungsvariable GOMAXPROCS lassen sich die OS-Threads von Go an das CPU-Limit des Containers anpassen, um GC-Latenzen zu verringern.
  • Automatisierung von GOMAXPROCS: Ubers Bibliothek automaxprocs kann GOMAXPROCS automatisch 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

 
GN⁺ 2023-11-09
Hacker-News-Kommentare
  • Diskussion über die Nutzung von CPU-Reservierungen statt CPU-Limits in Container-Umgebungen
  • Problem der fehlerhaften Erkennung der Kernanzahl durch Anwendungen innerhalb von Containern
  • Detaillierte Erklärung der Docker-CFS-cgroup-Einstellungen und Empfehlung zur Verwendung von --cpu-shares
  • Berichte über Erfahrungen mit CFS-Scheduler-Problemen in Containern und Neugier auf den neuen Scheduler
  • Erwähnung der Einführung von GOMEMLIMIT in Go sowie des Tools zur automatischen Speicherlimit-Setzung (automemlimit)
  • Geteilte Herausforderungen bei der Verwaltung von CPU-Limits für Go-Deployments in Kubernetes-Clustern
  • Ausdruck von Dank an den Maintainer des ko-Tools für die Erwähnung des Projekts
  • Frage, ob die Go-Runtime CGroups-Limits erkennen kann, und ob andere Runtimes sich ähnlich verhalten
  • Diskussion über die Verringerung der GC-Latenz durch die Ausführung gleichzeitiger Arbeit vor dem Erreichen eines Safe-Points
  • Erwähnung, dass das .NET-CLR-Team ähnliche Szenarien in Container-Umgebungen angepasst hat