คู่มือเกมแลค › L9 โปรเซสเกมฝั่งเซิร์ฟเวอร์
ลูปไม่รู้จบ/ลอจิกทำงานไม่หยุด Infinite loop / runaway logic
ID สาเหตุ sp-infinite-loop · ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้าบั๊กทำให้ทิกหนึ่งไม่จบ เซิร์ฟเวอร์จะหยุด และ watchdog จะบังคับรีสตาร์ต
ทำไม ลูปไม่จบเพราะเงื่อนไขผิด หรือ recursion ไม่หยุด → ผลคือ ทิกไม่จบ เซิร์ฟเวอร์จึงหยุด → บนหน้าจอ ค้างแล้วทุกคนก็หลุด
- อาการ
- ค้าง, หลุด
- ปัจจัย
- การหยุดชะงัก
- ใครเจอ
- บางจุด/บางแชนแนล, ทั้งเซิร์ฟเวอร์
- เกิดเมื่อไร
- ตอนทำแอ็กชันบางอย่าง, สุ่มเป็นครั้งคราว
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- จำกัดจำนวนรอบของลูป, มี watchdog, เขียนเทสต์ที่จำลองอินพุตที่ก่อปัญหา
- บนกราฟ
- การเชื่อมต่อหลุดพร้อมกัน · จำนวนการเชื่อมต่อ, CPU แยกตามเธรด
- จุดที่ต้องดู
- CPU แยกตามเธรดจาก pidstat -t 1 ระหว่างที่หยุด และดูว่าเธรดที่วิ่งอยู่ที่ 100% วนอยู่ในฟังก์ชันไหนด้วย perf top -t (thread ID) หรือ gdb ถ้ารีสตาร์ตไปแล้ว ให้ดูบันทึก watchdog หมดเวลา (WatchdogSec ของ systemd, liveness probe ของ Kubernetes ล้มเหลว)
- สัญญาณว่าใช่
- ระหว่างที่เซิร์ฟเวอร์หยุด เธรดเกมตัวหนึ่งติดอยู่ที่ CPU 100% และ stack วนอยู่ในฟังก์ชันหรือลูปเดิม
- สัญญาณว่าไม่ใช่
- CPU ใกล้ 0 ระหว่างที่หยุด: น่าจะเป็นเดดล็อกหรือการรอการตอบกลับจากภายนอก
- วิธีตรวจ
- ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
แหล่งอ้างอิง
- systemd.service(5) — Linux manual page systemd
WatchdogSec=: ถ้าเซอร์วิสไม่ส่งสัญญาณว่ายังทำงานอยู่ (WATCHDOG=1) ภายในเวลาที่กำหนด จะถือว่าล้มเหลวและหยุดการทำงาน แล้วรีสตาร์ตอัตโนมัติตามค่า Restart= - Liveness, Readiness, and Startup Probes Kubernetes
liveness probe จับสถานะที่แอปยังรันอยู่แต่ทำงานต่อไม่ได้แล้วรีสตาร์ต, ค่าเริ่มต้นตรวจทุก 10 วินาที และรีสตาร์ตเมื่อล้มเหลวติดกัน 3 ครั้ง - pidstat(1) — Linux manual page sysstat
-t แสดงสถิติแยกตามเธรดของโปรเซส (อัตราการใช้ CPU เป็นต้น) ไปด้วย - perf-top(1) — Linux manual page perf
แสดงสัดส่วนการใช้ CPU ของเธรด (-t) หรือโปรเซส (-p) ที่กำลังรันแยกตามฟังก์ชัน (symbol) แบบเรียลไทม์
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L9 โปรเซสเกมฝั่งเซิร์ฟเวอร์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (ค้าง)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง