คู่มือเกมแลค › ค้นหาตามอาการ
หลุด: 51 สาเหตุและทีมที่ต้องแก้
เรียกอีกอย่างว่า: เกมเด้ง, เน็ตหลุด, ขาดการเชื่อมต่อกับเซิร์ฟเวอร์
เปิดพจนานุกรมอาการในฉบับหลักที่มีภาพ →
การเชื่อมต่อขาดระหว่างเล่น แล้วเด้งกลับไปหน้าล็อกอินหรือหน้าต่างเชื่อมต่อใหม่
ค้างไปหลายวินาทีแล้วขึ้นข้อความ “ขาดการเชื่อมต่อ” ถ้าหลายคนหลุดพร้อมกัน แปลว่าเป็นปัญหาฝั่งเซิร์ฟเวอร์
ไม่มีแพ็กเก็ตมาถึงเลยสักตัวภายในเวลาไทม์เอาต์ ให้ดูเน็ตขาดเป็นเวลานาน, idle timeout, เซิร์ฟเวอร์แครชหรือรีสตาร์ต และเซิร์ฟเวอร์หรือ PC ของเราที่หยุดนานกว่าไทม์เอาต์ (โหลดนาน) ถ้าเกมปิดตัวไปเลยโดยไม่มีข้อความแจ้ง ให้ดูว่าไคลเอนต์ถูกปิดกะทันหัน (แครช, หน่วยความจำไม่พอ) ก่อนเรื่องการเชื่อมต่อ
สาเหตุที่ทำให้เกิดอาการนี้
L1 โปรเซสเกมฝั่งไคลเอนต์
- หน่วยความจำรั่วฝั่งไคลเอนต์: ยิ่งเปิดไว้นาน หน่วยความจำยิ่งเพิ่ม เกมช้าลงเรื่อย ๆ แล้วสุดท้ายก็ถูกบังคับปิด (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- ไคลเอนต์แครช: เกมปิดตัวลงเพราะข้อผิดพลาดที่ไม่ได้จัดการ ผู้เล่นเห็นเหมือนหลุด แต่เซิร์ฟเวอร์ปกติ (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- การตรวจของโมดูลความปลอดภัยเกม (anti-cheat): โมดูลความปลอดภัยที่ทำงานคู่กับเกมเพื่อกันโปรโกงจะตรวจสอบเป็นระยะ ถ้าการตรวจหนัก หรือ heartbeat (สัญญาณยืนยันว่ายังทำงานอยู่ที่ส่งเป็นระยะ) ที่รับส่งกับเซิร์ฟเวอร์ความปลอดภัยมาช้า เกมจะกระตุกหรือหลุด (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
L2 OS และอุปกรณ์ฝั่งไคลเอนต์
- สลับแอปมือถือไปเบื้องหลัง: ถ้าย่อแอปลงไปแป๊บเดียวเพื่อดูแจ้งเตือน OS จะพักการทำงาน (suspend) ของแอปภายในไม่กี่วินาที และระหว่างนั้นเซิร์ฟเวอร์จะตัดการเชื่อมต่อของเรา (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- สลับ Wi-Fi ↔ LTE/5G: เมื่อเดินออกจากบ้านแล้ว Wi-Fi หลุดและเปลี่ยนไปใช้ LTE หรือ 5G IP address ของเราจะเปลี่ยน การเชื่อมต่อเดิมจึงใช้ไม่ได้ (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- จำกัดการประมวลผลเมื่อย่อหรือสลับหน้าต่าง: เมื่อไปดูหน้าต่างอื่นหรือย่อเกม ตัวเกมและ Windows จะลดความเร็วการทำงานของเกมเพื่อประหยัดไฟ พอกลับมา แพ็กเก็ตที่กองรอจะทะลักเข้ามา หรือหลุดไปแล้ว (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- โปรแกรมโอเวอร์เลย์รบกวน: โปรแกรมแชต, launcher, โปรแกรมอัดจอ และโปรแกรมแสดง FPS จะแทรกเข้าไปในขั้นตอนการเรนเดอร์ของเกม (hooking) เพื่อวาด UI ของตัวเองทับบนจอเกม งานในแต่ละเฟรมจึงเพิ่มขึ้น และบางครั้งก็ชนกับเกมจนภาพหยุดแวบหรือเกมถูกบังคับปิด (ภายนอก (ภายนอก))
L3 เครือข่ายในบ้าน
- NAT mapping หมดอายุ: เราเตอร์จะลบการเชื่อมต่อที่ idle (ไม่มีแพ็กเก็ตวิ่งมาสักพัก) ออกจากตาราง NAT นี่คือสาเหตุที่พบบ่อยของอาการหลุดตอนที่เพิ่งขยับหลังจากอยู่เฉย ๆ (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- เราเตอร์สเปกไม่พอหรือร้อนเกิน: เมื่ออุปกรณ์หลายสิบเครื่องและการเชื่อมต่อหลายพันรายการมารวมที่เราเตอร์ราคาถูก ตัวเราเตอร์เองจะประมวลผลไม่ไหว (ภายนอก (ภายนอก))
- handover ระหว่างเสาสัญญาณ (ขณะเดินทาง): เมื่อเดินทางด้วยรถเมล์หรือรถไฟใต้ดิน การสื่อสารจะขาดช่วงระหว่างที่เปลี่ยนเสาสัญญาณ (ภายนอก (ภายนอก))
- สัญญาณมือถืออ่อนหรืออยู่ในจุดอับสัญญาณ: ในลิฟต์, ชั้นใต้ดิน หรือด้านในอาคาร การส่งซ้ำจะเพิ่มขึ้น ความเร็วลดลง และสุดท้ายก็หลุด (ภายนอก (ภายนอก))
L4 เส้นทางอินเทอร์เน็ต
- การจำกัด UDP และตรวจแพ็กเก็ตระดับประเทศหรือ ISP: บางเครือข่ายบล็อก IP หรือพอร์ต UDP บางตัว หรือจำกัดความเร็ว UDP และอุปกรณ์ตรวจแพ็กเก็ตจะกรองโปรโตคอลที่ไม่รู้จักทิ้ง เกมที่สื่อสารด้วย UDP จึงเชื่อมต่อในเครือข่ายนั้นไม่ได้หรือหลุดบ่อย (ภายนอก (ภายนอก))
- คุณภาพสายเน็ตแย่: ขั้วต่อหลวม สายเก่า หรือโมเด็มผิดปกติ ทำให้แพ็กเก็ตหายอย่างต่อเนื่องและเน็ตขาดเป็นระยะ (ภายนอก (ภายนอก))
- ลิงก์ที่ใช้ร่วมกันเต็มเพราะ DDoS: การโจมตีปริมาณมหาศาลที่พุ่งเป้ามาที่บริษัทเกม หรือที่อื่นในเครือข่ายเดียวกัน ทำให้ลิงก์ที่ใช้ร่วมกันเต็ม (อินฟราเครือข่าย (ทีมอินฟรา))
- IP ที่ ISP ให้ใช้ร่วมกัน (CGNAT): เครือข่ายมือถือและ ISP บางรายให้ผู้ใช้บริการหลายรายใช้ IP เดียวร่วมกัน และลบ mapping ของการเชื่อมต่อที่ idle ภายในเวลาสั้น ๆ (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
L5 อุปกรณ์เครือข่ายในดาต้าเซ็นเตอร์
- ตารางเซสชันของไฟร์วอลล์เต็ม: ไฟร์วอลล์บันทึกทุกการเชื่อมต่อที่ปล่อยผ่านไว้ในตารางเซสชันเพื่อติดตาม เมื่อตารางเต็มก็รับการเชื่อมต่อใหม่ไม่ได้ (อินฟราเครือข่าย (ทีมอินฟรา))
- idle timeout ของโหลดบาลานเซอร์: โหลดบาลานเซอร์ลบการเชื่อมต่อที่ idle ทิ้งหลังผ่านไประยะหนึ่ง ฝั่งเกมยังคิดว่าการเชื่อมต่อยังอยู่ จนกระทั่งหลุด (อินฟราเครือข่าย (ทีมอินฟรา))
- connection tracking ของ security group บนคลาวด์หมดอายุ: ไฟร์วอลล์ที่ผูกกับเซิร์ฟเวอร์บนคลาวด์ (security group) ก็ติดตามการเชื่อมต่อเช่นกัน และรายการที่ติดตามของการเชื่อมต่อที่ idle จะหมดอายุหลังเวลาที่กำหนด แม้เป็นเซิร์ฟเวอร์ที่ผู้เล่นเชื่อมต่อตรงโดยไม่มีโหลดบาลานเซอร์ ผู้เล่นที่อยู่เฉย ๆ ก็อาจหลุดได้ (อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา))
- การ failover ของอุปกรณ์เครือข่าย: ระหว่างไม่กี่วินาทีที่เราเตอร์หรือไฟร์วอลล์ตัวหนึ่งเสียแล้วสลับไปใช้อุปกรณ์สำรอง (failover) ทุกคนจะค้างพร้อมกัน (อินฟราเครือข่าย (ทีมอินฟรา))
- MTU ไม่ตรงกัน (เฉพาะแพ็กเก็ตใหญ่ที่หาย): ถ้า MTU (ขนาดที่ส่งได้ในครั้งเดียว) ของช่วงกลางทางลดลง แต่ข้อความแจ้งว่าขนาดเกินถูกบล็อก แพ็กเก็ตใหญ่จะหายไปเรื่อย ๆ (อินฟราเครือข่าย (ทีมอินฟรา))
L6 การ์ดเครือข่ายของเซิร์ฟเวอร์
- การซ่อมบำรุงโฮสต์คลาวด์/live migration: เมื่อผู้ให้บริการคลาวด์ซ่อมบำรุงเครื่องจริง (โฮสต์) จะย้าย VM ไปโฮสต์อื่น (live migration) หรือหยุด VM ชั่วคราว ระหว่างนั้นทั้งเซิร์ฟเวอร์จะหยุด และถ้าหยุดนาน การเชื่อมต่อจะขาด (อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา))
- ปัญหาไดรเวอร์/เฟิร์มแวร์ของ NIC: ระหว่างที่การ์ดหยุดแล้วเริ่มใหม่เพราะบั๊กของไดรเวอร์หรือฟีเจอร์ทำงานผิดพลาด การรับส่งทั้งหมดจะขาด (อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา))
L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
- OOM killer: เมื่อหน่วยความจำหมด Linux จะเลือกโปรเซสที่ใช้หน่วยความจำมากที่สุดแล้วบังคับปิด ซึ่งส่วนใหญ่คือเซิร์ฟเวอร์เกม (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- นาฬิการะบบกระโดด (NTP step): ถ้านาฬิกาของเซิร์ฟเวอร์ถูกปรับไปข้างหน้าหรือถอยหลังหลายวินาทีในครั้งเดียว ตัวจับเวลาที่อิงนาฬิการะบบจะทำงานพร้อมกันรวดเดียวหรือหยุดไป (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
L8 ซ็อกเก็ตและโปรโตคอล
- TCP RTO และ exponential backoff: ทุกครั้งที่การส่งซ้ำล้มเหลวอีก เวลารอจะเพิ่มเป็นสองเท่า การเชื่อมต่อที่ขาดไปแป๊บเดียวจึงกลายเป็นการหยุดยาว (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- นโยบายจัดการไคลเอนต์ที่ช้า (slow consumer): เมื่อข้อมูลที่ต้องส่งให้ไคลเอนต์ใดกองสะสมเรื่อย ๆ เซิร์ฟเวอร์จะทิ้งอัปเดตเก่าหรือตัดการเชื่อมต่อ (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- ข้อมูลสุดท้ายหายเพราะปิดการเชื่อมต่อแบบบังคับ (RST): ถ้าเซิร์ฟเวอร์ตัดการเชื่อมต่อแบบกะทันหัน ข้อความแจ้งสุดท้ายหรือสัญญาณว่าบันทึกข้อมูลเสร็จที่ส่งออกไปจะหายไป (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- การกระจายของ SO_REUSEPORT ไม่สมดุล: เมื่อหลายโปรเซสแบ่งกันรับพอร์ตเดียวกัน เคอร์เนลจะกำหนดโปรเซสที่รับแต่ละการเชื่อมต่อด้วย hash ของที่อยู่ และไม่เปลี่ยนอีก ถ้าโปรเซสตัวใดหยุด เฉพาะคนที่ถูกจัดให้โปรเซสนั้นจะต้องรอ (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- ข้อผิดพลาด WSAECONNRESET บนซ็อกเก็ต UDP ของ Windows: ถ้าเซิร์ฟเวอร์ Windows ส่ง UDP ไปหาไคลเอนต์ที่ออกไปแล้ว จะได้ข้อความแจ้ง “ไม่พบพอร์ต” (ICMP) กลับมา ข้อความนั้นทำให้การเรียกรับครั้งถัดไปจบด้วยข้อผิดพลาด และถ้าโค้ดเซิร์ฟเวอร์ถือว่าข้อผิดพลาดนี้คือซ็อกเก็ตเสีย ทุกคนที่ใช้ซ็อกเก็ตนั้นจะได้รับผลกระทบ (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
L9 โปรเซสเกมฝั่งเซิร์ฟเวอร์
- เดดล็อก: ถ้าสองเธรดต่างรอล็อกที่อีกฝ่ายถืออยู่ ทั้งคู่จะหยุดไปตลอดกาล (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- เซิร์ฟเวอร์แครช: ถ้าโปรเซสเซิร์ฟเวอร์ตายเพราะข้อผิดพลาดที่ไม่ได้จัดการ ทุกคนในเซิร์ฟเวอร์นั้นจะหลุดพร้อมกัน (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- ลูปไม่รู้จบ/ลอจิกทำงานไม่หยุด: ถ้าบั๊กทำให้ทิกหนึ่งไม่จบ เซิร์ฟเวอร์จะหยุด และ watchdog จะบังคับรีสตาร์ต (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
L10 หน่วยความจำ
- หน่วยความจำรั่ว: หน่วยความจำที่ไม่ถูกคืนค่อย ๆ สะสม จนหลายวันต่อมานำไปสู่ GC ทำงานไม่หยุด, สวอป หรือโปรเซสถูกบังคับปิด (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- GC thrashing (heap เหลือที่ว่างไม่พอ): เมื่อข้อมูลที่ยังใช้อยู่ (live data) เข้าใกล้ขีดจำกัดของ heap แม้ GC ทำงานก็แทบไม่มีอะไรให้เก็บคืน GC จึงวนทำงานซ้ำไม่หยุด (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- หน่วยความจำแตกกระจาย (fragmentation): ถ้าจัดสรรและคืนหน่วยความจำซ้ำไปมาจนพื้นที่ว่างแตกเป็นชิ้นเล็ก ๆ โปรเซสจะถือครองหน่วยความจำมากกว่าที่ใช้จริงมาก (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
L11 ดิสก์
- ดิสก์เต็ม: ถ้า log และ dump สะสมจนดิสก์เต็ม การเขียนจะล้มเหลว และถ้าไม่ได้เตรียมรับมือไว้ เซิร์ฟเวอร์จะล่ม (อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา))
L12 ฐานข้อมูล
- failover ของ DB: ระหว่างที่ DB หลักล่มและสลับไปใช้ DB สำรอง จะเขียนข้อมูลไม่ได้ และข้อมูลช่วงท้ายที่ยัง replicate ไม่ทันอาจหายไป (อินฟรา DB (ทีมอินฟรา))
L13 สถาปัตยกรรมเซิร์ฟเวอร์และการดูแลระบบ
- การผ่านเกตเวย์/พร็อกซี: ถ้าวางเซิร์ฟเวอร์คั่นกลางระหว่างไคลเอนต์กับเซิร์ฟเวอร์เกม ทุกครั้งที่ผ่านจะมีเวลาประมวลผลเพิ่มขึ้น และเซิร์ฟเวอร์ตัวนั้นจะกลายเป็น single point of failure (จุดเดียวที่ล่มแล้วกระทบทั้งระบบ) (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- ย้ายโซน (ส่งต่อตัวละครข้ามเซิร์ฟเวอร์): เมื่อเข้าพื้นที่หรือดันเจี้ยนอื่น ขั้นตอนส่งข้อมูลตัวละครไปยังเซิร์ฟเวอร์อื่นทำให้เกิดดีเลย์และความล้มเหลว (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- การ deploy และรีสตาร์ต: ถ้ารีสตาร์ตเซิร์ฟเวอร์เพื่ออัปเดตโดยไม่ย้ายการเชื่อมต่อ ผู้เล่นที่อยู่บนเซิร์ฟเวอร์นั้นจะหลุด และการบันทึกข้อมูลก่อนปิดกับการเชื่อมต่อใหม่จะทะลักเข้ามาพร้อมกัน (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- คิวล็อกอินชนเพดานและ grace period ตอนเชื่อมต่อใหม่ไม่พอ: เมื่อคนแห่เข้ามาทันทีหลังเปิดตัวเกมหรือปิดปรับปรุง คิวล็อกอินจะชนเพดานจนปฏิเสธคนที่จะเข้าคิวใหม่ และผู้เล่นที่รออยู่ถ้าหลุดไปแป๊บเดียวก็เสียลำดับคิวแล้วต้องกลับไปต่อท้าย (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
การออกแบบการซิงก์
- โครงสร้างแบบโฮสต์ (หัวห้อง): ถ้า PC ของผู้เล่นคนหนึ่งทำหน้าที่เป็นเซิร์ฟเวอร์ เน็ตและสเปก PC ของคนนั้นจะกำหนดฟีลการเล่นของทุกคน (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
ปัญหาที่เกิดกับบางคนเท่านั้น
- false positive ของการตรวจสอบที่กระจุกกับผู้ใช้บาง ISP: คนที่ใช้เน็ตที่จิตเตอร์สูง อินพุตจะไปถึงเป็นกลุ่ม จึงติดการตรวจความเร็วและคูลดาวน์ของเซิร์ฟเวอร์บ่อย (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- พอร์ต UDP แบบตายตัวชนกัน: ถ้าไคลเอนต์ถูกออกแบบให้ใช้พอร์ตภายในเครื่องที่กำหนดตายตัว ไคลเอนต์ตัวที่สองบน PC เดียวกันจะใช้พอร์ตไม่ได้ หรือต้องแบ่งรับแพ็กเก็ตกับตัวแรก (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- บั๊กแยกเซสชันด้วย IP/ID เครื่อง: ถ้าเซิร์ฟเวอร์หรือเซิร์ฟเวอร์ตัวกลางแยกการเชื่อมต่อด้วย IP หรือ ID เครื่อง สองไคลเอนต์ใน PC เดียวกัน (public IP เดียวกัน) จะถูกมองเป็นคนเดียว (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- การจำกัดการเปิดหลายไคลเอนต์: ถ้าโมดูลความปลอดภัยหรือนโยบายของเซิร์ฟเวอร์จำกัดการเปิดหลายไคลเอนต์ใน PC เดียว ไคลเอนต์ตัวที่สองจะเปิดหรือเชื่อมต่อไม่ได้ หรือตัวที่เปิดก่อนจะหลุด บางเกมบล็อกแค่บางฟีเจอร์ของไคลเอนต์ที่เปิดเพิ่ม (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- จำกัดการประมวลผลของหน้าต่างเบื้องหลัง: สำหรับไคลเอนต์ที่เป็นหน้าต่างเบื้องหลัง ตัวเกม เอนจิน และ OS จะลดเฟรมและการประมวลผลลง แพ็กเก็ตที่ได้รับจึงประมวลผลไม่ทันจนกองรอหรือล้น (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
ต้นเหตุของการส่งซ้ำใน TCP
ดูพจนานุกรมอาการในฉบับหลักที่มีภาพ