Go, คอนเทนเนอร์ และตัวจัดตารางงานของ Linux
(riverphillips.dev)- แอปพลิเคชัน 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
--cpu-sharesGOMEMLIMITของ Go และเครื่องมือสำหรับตั้งค่าขีดจำกัดหน่วยความจำอัตโนมัติ (automemlimit)koที่กล่าวถึงโปรเจกต์