คู่มือเกมแลค › L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
CPU throttling ของคอนเทนเนอร์ (CFS quota) Container CPU throttling (CFS quota)
ID สาเหตุ so-cpu-quota · ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้าตั้งขีดจำกัด CPU ให้คอนเทนเนอร์ เมื่อใช้โควตาหมดภายในรอบที่กำหนด (ปกติ 100 ms) คอนเทนเนอร์จะถูกบังคับหยุดตลอดเวลาที่เหลือของรอบนั้น (throttling)
ทำไม ตั้งขีดจำกัด CPU (limit) ให้คอนเทนเนอร์เซิร์ฟเวอร์เกมไว้ เช่น ใน Kubernetes → ผลคือ ตอนที่งานคำนวณทิกมากระจุกกัน โควตาหมดจนต้องหยุดหลายสิบ ms รอรอบถัดไป → บนหน้าจอ CPU เฉลี่ยต่ำ แต่ทิกพุ่งเป็นรอบ: กระตุก, สโลว์โมชั่น
- อาการ
- กระตุก, สโลว์โมชั่น
- ปัจจัย
- การหยุดชะงัก, จิตเตอร์
- ใครเจอ
- ทั้งเซิร์ฟเวอร์
- เกิดเมื่อไร
- ตอนคนแห่มารวมกัน, สุ่มเป็นครั้งคราว
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- ตั้งจำนวน worker thread ให้เท่ากับขีดจำกัด CPU (อย่าให้ runtime สร้างเธรดเท่าจำนวนคอร์ทั้งหมดของโฮสต์)
- งานฝั่งทีมอินฟรา
- ตั้งขีดจำกัด CPU ให้เผื่อมาก ๆ หรือเอาออกแล้วจัดคอร์เฉพาะให้, มอนิเตอร์จำนวนครั้งที่ถูก throttle (nr_throttled)
- ตัวเลขที่ควรรู้
- บนเซิร์ฟเวอร์ที่จำกัดไว้ 2 คอร์ ถ้าเธรด 8 ตัวทำงานพร้อมกัน จะใช้โควตาของรอบ 100 ms หมดภายใน 25 ms แล้วหยุดไป 75 ms
- บนกราฟ
- สูงตามจำนวนคนและโหลด · จำนวนครั้งที่ถูก throttle (nr_throttled), เวลาต่อทิกของเซิร์ฟเวอร์
- จุดที่ต้องดู
- ค่าที่เพิ่มขึ้นของ nr_throttled และ throttled_usec (cgroup v1 คือ nr_throttled และ throttled_time) ใน cpu.stat ของ cgroup คอนเทนเนอร์ ดูคู่กับเวลาต่อทิกของเซิร์ฟเวอร์
- สัญญาณว่าใช่
- อัตราการใช้ CPU เฉลี่ยต่ำกว่าขีดจำกัด แต่ nr_throttled และ throttled_usec เพิ่มขึ้นเรื่อย ๆ และตรงกับช่วงที่ทิกพุ่ง
- สัญญาณว่าไม่ใช่
- nr_throttled ไม่เพิ่ม: ไม่ใช่สาเหตุนี้ ถ้าตัว VM เองถูกแย่ง CPU ให้ดู “CPU steal (VM)”
- วิธีตรวจ
- ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
แหล่งอ้างอิง
- CFS Bandwidth Control Linux kernel
ถ้าใช้โควตาของรอบหมด เธรดจะหยุดจนถึงรอบถัดไป (throttling), รอบเริ่มต้น 100 ms, สถิติ nr_throttled - Control Group v2 Linux kernel
cpu.max ใช้รูปแบบ “$MAX $PERIOD” (โควตา, รอบ) และค่าเริ่มต้นคือ “max 100000” (รอบ 100 ms) - Resource Management for Pods and Containers Kubernetes
CPU limit ของคอนเทนเนอร์เป็นขีดจำกัดแบบ hard ที่เคอร์เนลบังคับด้วย CPU throttling
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กระตุก)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง