2 คะแนน โดย GN⁺ 2023-11-09 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แอปพลิเคชัน Go ภายในคอนเทนเนอร์: นักพัฒนา Go มักดีพลอยแอปพลิเคชันลงในคอนเทนเนอร์ที่ต้องมีการจำกัด CPU เพื่อป้องกันการผูกขาดทรัพยากรของโฮสต์
  • รันไทม์ของ Go กับการจำกัด CPU: รันไทม์ของ Go ไม่ได้รับรู้การจำกัด CPU ของคอนเทนเนอร์โดยเนื้อแท้ ซึ่งอาจทำให้ใช้ทรัพยากรมากเกินไปและเกิดปัญหาด้านประสิทธิภาพ
  • ตัวเก็บกวาดขยะ (GC) ของ Go: GC ของ Go ทำงานแบบพร้อมกันได้ แต่ยังต้องมีการหยุดชั่วคราวสั้นๆ แบบ 'หยุดทั้งโลก' เพื่อรักษาความถูกต้องของข้อมูลระหว่างช่วงสิ้นสุดการกวาดและสิ้นสุดการมาร์ก
  • ตัวจัดตารางงานของ Linux - CFS: Completely Fair Scheduler (CFS) ของ Linux จัดสรรเวลา CPU ตามสัดส่วน และโปรเซสจะได้รับเวลา CPU ตามจำนวนคอร์ที่ได้รับอนุญาต
  • ปัญหาระหว่าง Go กับ CFS: Go สร้างเธรด OS หนึ่งตัวต่อคอร์ CPU แต่ละคอร์ ทว่าไม่สนใจการจำกัด CPU ของคอนเทนเนอร์ ซึ่งอาจทำให้เวลาของ GC แบบ 'หยุดทั้งโลก' นานขึ้น
  • การตั้งค่า GOMAXPROCS: สามารถใช้ตัวแปรสภาพแวดล้อม GOMAXPROCS เพื่อให้จำนวนเธรด OS ของ Go สอดคล้องกับการจำกัด CPU ของคอนเทนเนอร์ และช่วยลดเวลาแฝงจาก GC ได้
  • การทำ GOMAXPROCS ให้เป็นอัตโนมัติ: ไลบรารี automaxprocs ของ Uber สามารถตั้งค่า GOMAXPROCS อัตโนมัติตามข้อจำกัดของคอนเทนเนอร์ ช่วยให้การตั้งค่าง่ายขึ้น
  • การปรับปรุงรันไทม์ของ Go ในอนาคต: มี GitHub issue ที่ยังเปิดอยู่เพื่อรวมความสามารถในการรับรู้การจำกัด CPU แบบอัตโนมัติเข้าไปในรันไทม์ของ Go

สรุป: การกำหนดค่าการจำกัด CPU และ GOMAXPROCS อย่างเหมาะสมเป็นสิ่งสำคัญเพื่อให้แอปพลิเคชัน Go ในคอนเทนเนอร์ใช้ทรัพยากรได้อย่างมีประสิทธิภาพและคงประสิทธิภาพการทำงานไว้ได้

1 ความคิดเห็น

 
GN⁺ 2023-11-09
ความคิดเห็นจาก Hacker News
  • มีการถกเถียงเรื่องการใช้ CPU reservation แทน CPU limit ในสภาพแวดล้อมคอนเทนเนอร์
  • ปัญหาที่แอปพลิเคชันภายในคอนเทนเนอร์ตรวจจับจำนวนคอร์ผิดพลาด
  • คำอธิบายรายละเอียดของการตั้งค่า Docker CFS cgroup และคำแนะนำให้ใช้ --cpu-shares
  • การแชร์ประสบการณ์ปัญหากับ CFS scheduler ภายในคอนเทนเนอร์ และความสนใจต่อ scheduler ตัวใหม่
  • การกล่าวถึงการเพิ่ม GOMEMLIMIT ของ Go และเครื่องมือสำหรับตั้งค่าขีดจำกัดหน่วยความจำอัตโนมัติ (automemlimit)
  • การแชร์ความท้าทายในการจัดการ CPU limit ของการดีพลอย Go ภายใน Kubernetes cluster
  • การแสดงความขอบคุณต่อผู้ดูแลเครื่องมือ ko ที่กล่าวถึงโปรเจกต์
  • คำถามเกี่ยวกับความสามารถของ Go runtime ในการรับรู้ขีดจำกัดของ CGroups และพฤติกรรมคล้ายกันใน runtime อื่น ๆ
  • การพูดคุยเรื่องการลด GC latency ด้วยการทำงานพร้อมกันก่อนถึง safe point
  • การกล่าวถึงว่าทีม .NET CLR ก็ได้ปรับรับกับสถานการณ์คล้ายกันในสภาพแวดล้อมคอนเทนเนอร์