คู่มือเกมแลค › L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
เธรดมากเกินไปและ context switch Thread oversubscription, context switching
ID สาเหตุ so-context · ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้ารันเธรดมากกว่าจำนวนคอร์มาก ๆ OS จะเสีย CPU ไปกับการสลับให้เธรดผลัดกันทำงานอย่างเดียว
ทำไม มีเธรดหลายร้อยถึงหลายพันตัว เช่น สร้างเธรดหนึ่งตัวต่อหนึ่งการเชื่อมต่อ → ผลคือ ต้นทุน context switch (การสลับเธรดที่กำลังรัน) และ cache miss เพิ่มขึ้น → บนหน้าจอ CPU ยุ่งแต่ throughput ต่ำ ทิกไม่สม่ำเสมอ จึงกระตุกและเป็นสโลว์โมชั่น
- อาการ
- กระตุก, สโลว์โมชั่น
- ปัจจัย
- การหยุดชะงัก, จิตเตอร์
- ใครเจอ
- ทั้งเซิร์ฟเวอร์
- เกิดเมื่อไร
- ตอนคนแห่มารวมกัน
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
- งานฝั่งทีมพัฒนาเกม
- ใช้จำนวนเธรดให้เหมาะกับจำนวนคอร์, ใช้ async I/O (epoll, IOCP)
- งานฝั่งทีมอินฟรา
- มอนิเตอร์จำนวน context switch และจำนวนเธรดที่รอรัน (cs และ r ของ vmstat)
- ตัวเลขที่ควรรู้
- context switch หนึ่งครั้งใช้เวลาไม่กี่ µs และถ้ารวมต้นทุน cache miss ที่ตามมาด้วยจะมากกว่านั้น
- บนกราฟ
- สูงตามจำนวนคนและโหลด · จำนวน context switch ต่อวินาที, จำนวนเธรดที่รอรัน
- จุดที่ต้องดู
- cs (context switch ต่อวินาที) และ r (จำนวนที่กำลังรันหรือรอ CPU) จาก vmstat 1 เทียบกับจำนวนคอร์ และ context switch แบบ voluntary (cswch/s) กับ involuntary (nvcswch/s) แยกตามเธรดของเซิร์ฟเวอร์เกมจาก pidstat -w -t
- สัญญาณว่าใช่
- เมื่อผู้เล่นออนไลน์เพิ่มขึ้น r พุ่งสูงกว่าจำนวนคอร์มาก cs ก็พุ่งตาม และมีเธรดหลายร้อยตัวที่มี involuntary context switch สูง
- สัญญาณว่าไม่ใช่
- r อยู่ไม่เกินจำนวนคอร์: ไม่ใช่สาเหตุนี้ ถ้ามีแต่ voluntary switch สูง แปลว่าเธรดกำลังรอล็อกหรือ I/O (“การแย่งล็อก”, “โครงสร้างแบบ blocking I/O”)
- วิธีตรวจ
- ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
แหล่งอ้างอิง
- Quantifying The Cost of Context Switch (ExpCS 2007) ACM
ต้นทุนทางตรงของ context switch ประมาณ 3.8 µs, ต้นทุนทางอ้อมรวมผลต่อแคชตั้งแต่ไม่กี่ µs ถึงมากกว่า 1,000 µs (ตามสภาพแวดล้อมที่วัด) - vmstat(8) — Linux manual page procps-ng
ฟิลด์ cs (จำนวน context switch ต่อวินาที) และ r (จำนวนโปรเซสที่กำลังรันหรือรอรัน) - I/O Completion Ports Microsoft
ใช้ thread pool ที่สร้างไว้ล่วงหน้าร่วมกับ IOCP จัดการ async I/O จำนวนมาก และกำหนดจำนวนเธรดที่รันพร้อมกันให้เท่ากับจำนวนที่ CPU รันพร้อมกันได้ - pidstat(1) — Linux manual page sysstat
cswch/s ของ -w คือ voluntary context switch ที่เธรดหยุดเองเพื่อรอทรัพยากร, nvcswch/s คือ involuntary context switch ที่ถูกสลับออกเพราะใช้ time slice หมด, -t แสดงแยกตามเธรด
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กระตุก)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง