คู่มือเกมแลค › L9 โปรเซสเกมฝั่งเซิร์ฟเวอร์
synchronous call บนเธรดเกม Synchronous DB / file I/O on the game loop
ID สาเหตุ sp-sync-call · ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้ารอการตอบกลับจาก DB หรือการเขียนไฟล์กลางทิก การดำเนินเกมทั้งหมดบนเซิร์ฟเวอร์จะหยุดไปเท่ากับเวลานั้น
ทำไม ทิกต้องรอการอ่านหรือบันทึก DB, การเขียน log หรือการเรียก API ภายนอก → ผลคือ ถ้า DB ใช้ 100 ms ทิกก็หยุด 100 ms → บนหน้าจอ ทุกครั้งที่ DB หรือดิสก์ช้าลง ทั้งฟิลด์จะหยุดแวบ
อาการ ค้าง , กระตุก
ปัจจัย การหยุดชะงัก
ใครเจอ บางจุด/บางแชนแนล, ทั้งเซิร์ฟเวอร์
เกิดเมื่อไร ตอนทำแอ็กชันบางอย่าง, สุ่มเป็นครั้งคราว
ผู้รับผิดชอบ ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม ส่งงานที่ช้าทั้งหมด (อ่านหรือบันทึก DB, เขียน log, เรียก API ภายนอก) ไปทำแบบ asynchronous แล้วนำผลมาใช้ในทิกถัดไป (ถ้าแค่ตั้งไทม์เอาต์ ระหว่างรอก็ยังหยุดอยู่ดี)
ตัวเลขที่ควรรู้ ต่อให้เวลาไปกลับถึง DB ในดาต้าเซ็นเตอร์เดียวกันแค่ 0.5 ms ถ้าเรียก 100 ครั้งในหนึ่งทิกก็เป็น 50 ms ลำพังส่วนนี้ก็กินงบเวลาที่ 20 ทิกจนหมด
บนกราฟ พุ่งแบบสุ่มเป็นครั้งคราว · เวลาต่อทิกของเซิร์ฟเวอร์, ความหน่วงของคิวรี DB
จุดที่ต้องดู กราฟเวลาต่อทิกวางบนแกนเวลาเดียวกับความหน่วงของคิวรี DB (slow query log เป็นต้น) และความหน่วงของดิสก์ ถ้าไม่มีเมตริกทิก ให้ใช้ bcc offcputime -p ดูว่าเธรดเกมรออยู่ที่ไหน สัญญาณว่าใช่ เวลาที่ทิกพุ่งตรงกับเวลาที่ความหน่วงของ DB หรือไฟล์พุ่ง และเวลารอของเธรดเกมกระจุกอยู่ใน call stack ที่รับการตอบกลับจาก DB หรือเขียนไฟล์ สัญญาณว่าไม่ใช่ ความหน่วงของ DB และดิสก์ปกติ แต่ทิกพุ่ง: น่าจะเป็น GC pause หรือการแย่งล็อก วิธีตรวจ ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม
แหล่งอ้างอิง Designs, Lessons and Advice from Building Large Distributed Systems Google keynote ของ LADIS 2009 (Jeff Dean) เวลาไปกลับภายในดาต้าเซ็นเตอร์เดียวกันประมาณ 0.5 ms (500,000 ns) ASP.NET Core Best Practices Microsoft เรียกการเข้าถึงข้อมูล I/O และงานที่ใช้เวลานานแบบ asynchronous, การเรียกแบบ synchronous ที่บล็อกทำให้ thread pool หมดและตอบสนองช้า Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor รวมเวลาที่เธรดหยุดอยู่นอก CPU (off-CPU) แยกตาม call stack, -p ระบุโปรเซส
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L9 โปรเซสเกมฝั่งเซิร์ฟเวอร์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (ค้าง)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง