แก้เซิร์ฟ Minecraft ค้าง Can't keep up ด้วยการสร้างแผนที่ล่วงหน้า
แก้ไขล่าสุด 13 ส.ค. 2569
ถ้าเปิด log เซิร์ฟแล้วเจอบรรทัดนี้บ่อย ๆ แปลว่าเซิร์ฟหยุดตอบสนองไปจริง ๆ ตามจำนวนวินาทีที่มันบอก และผู้เล่นจะรู้สึกเหมือนตัวค้างกลางอากาศ
[20:25:21] [Server thread/WARN]: Can't keep up! Running 58004ms behind, skipping 1160 tick(s)บทความนี้เขียนจากการไล่แก้เซิร์ฟจริงที่มีผู้เล่น 7 คน ตัวเลขทุกตัวข้างล่างวัดมาจากเครื่องจริง ไม่ได้คัดลอกมาจากที่อื่น
อย่าเพิ่งซื้อ RAM เพิ่ม - ตรวจให้ครบก่อน
สิ่งแรกที่คนส่วนใหญ่ทำคือเพิ่ม RAM หรือย้ายไปแพ็กเกจแรงขึ้น ซึ่งมักไม่ช่วยเลย เพราะโลกของ Minecraft ประมวลผลบน เธรดเดียว เพิ่มคอร์ไปก็ไม่มีใครใช้
ไล่ตัดสาเหตุตามลำดับนี้ ใช้เวลาไม่กี่นาทีและประหยัดเงินได้เยอะ
| สงสัยว่า | ตรวจยังไง | ถ้าปกติจะเห็น |
|---|---|---|
| RAM ไม่พอจนต้องใช้ swap | ดูค่า swap ของเครื่อง | swap เป็น 0 และไม่มี page fault |
| โดนฆ่าเพราะใช้ RAM เกิน | ดูจำนวนครั้งที่ชนเพดานหน่วยความจำ | เป็น 0 และเซิร์ฟไม่เคยรีสตาร์ทเอง |
| CPU ไม่พอ | ดู load average เทียบจำนวนคอร์ | load ต่ำกว่าจำนวนคอร์มาก |
| สร้าง chunk ใหม่ | นับไฟล์ region ที่ถูกสร้างวันนี้ | ถ้าเยอะผิดปกติ คือตัวนี้ |
ในเคสจริงที่ผมเจอ สามข้อแรกปกติหมด แต่ข้อสุดท้ายพบว่า ไฟล์ region 118 จาก 153 ไฟล์ถูกสร้างขึ้นในวันเดียว คือ 77% ของแผนที่ทั้งผืนเพิ่งเกิดวันนั้น เพราะผู้เล่นกำลังกระจายกันออกไปสำรวจที่ใหม่พร้อมกัน
ทำไมการสร้าง chunk ถึงทำให้ค้างนาน
ทุกครั้งที่มีคนเดินเข้าพื้นที่ที่ยังไม่เคยมีใครไป เซิร์ฟต้อง หยุดทุกอย่างเพื่อสร้างภูมิประเทศตรงนั้นก่อน ถ้าใน chunk นั้นมีดันเจี้ยนหรือสิ่งปลูกสร้างใหญ่ ยิ่งใช้เวลานาน และถ้าหลายคนสำรวจพร้อมกัน งานก็กองทับกัน
ม็อดแพ็กที่ใช้ตัวสร้างแผนที่แบบพิเศษอย่าง OpenTerrainGenerator (เช่น RLCraft Dregora) ช้ากว่าปกติหลายเท่า เพราะต้องคำนวณไบโอมและโครงสร้างของตัวเองเพิ่ม
ระวังกับดัก: TPS มองไม่เห็นอาการนี้
อย่าใช้คำสั่งดู TPS ตัดสินว่าเซิร์ฟมีปัญหาไหม - ตอนค้างแบบนี้เซิร์ฟจะ ข้าม tick ทิ้ง แล้วกระโดดตามเวลาจริง ค่าเฉลี่ยจึงยังขึ้น 20.00 สวย ๆ ทั้งที่ผู้เล่นค้างไป 30 วินาที
ผมพลาดตรงนี้มาแล้วตอนทดสอบ - วัด TPS ได้ 20.00 ตลอดเลยสรุปว่าไม่กระทบใคร แต่พอไปนับใน log จริงกลับพบว่าเกิดอาการค้าง 21 ครั้ง รวม 145 วินาที ครั้งที่หนักสุดยาว 30 วินาที
ตัวชี้วัดที่ถูกคือนับจำนวนบรรทัด Can't keep up ใน log ไม่ใช่ดู TPS
วิธีแก้: สร้างแผนที่ทิ้งไว้ล่วงหน้า
แนวคิดคือสร้าง chunk ทั้งผืนไว้ก่อนตอนไม่มีคนเล่น พอสร้างครบแล้วการสำรวจจะไม่กินอะไรเลย เพราะ chunk มีอยู่บนดิสก์แล้ว อาการหายสนิท ไม่ใช่แค่ลดลง
ถ้าเป็นเซิร์ฟ Forge
Forge มีคำสั่งนี้มาให้อยู่แล้ว ไม่ต้องลงม็อดเพิ่มและไม่ต้องรีสตาร์ท
/forge gen <x> <y> <z> <จำนวน chunk>
/forge gen -392 68 1609 15625พิกัดที่ใส่เป็น หน่วยบล็อก แต่ข้อความที่ตอบกลับมาเป็นหน่วย chunk (หารด้วย 16) ไม่ได้ผิดอะไร ส่วนรูปทรงที่มันสร้างเป็นจัตุรัสวนออกจากจุดกลาง
จะใส่กี่ chunk
อยากครอบคลุมรัศมี r บล็อก ให้คิดเป็นจำนวน chunk ตามสูตร (2 × r ÷ 16 + 1)² หรือดูจากตารางนี้ได้เลย
| รัศมี (บล็อก) | ต้องใส่ (chunk) | เวลาโดยประมาณ |
|---|---|---|
| 500 | 3,969 | ราว 5 นาที |
| 1,000 | 15,625 | ราว 25 นาที |
| 2,000 | 63,001 | ราว 1 ชม. 45 นาที |
| 5,000 | 393,129 | ราว 7-8 ชม. |
ตัวเลขเวลาวัดจากเซิร์ฟม็อดแพ็กหนัก (217 ม็อด + OTG) ได้ราว 13 chunk ต่อวินาที ตอนไม่มีคนเล่น เซิร์ฟวานิลลาหรือ Paper จะเร็วกว่านี้มาก
ข่าวดีคือ chunk ที่เคยสร้างไปแล้วเกมจะข้ามฟรี งานจริงจึงมักเร็วกว่าตาราง - รอบที่ผมสั่ง 15,625 chunk รอบฐานผู้เล่นซึ่งสร้างไว้แล้วกว่าครึ่ง จบใน 10 นาทีแทนที่จะเป็น 25
ถ้าเป็นเซิร์ฟ Paper หรือ Spigot
ไม่มีคำสั่งในตัว ต้องลงปลั๊กอินอย่าง Chunky ซึ่งทำงานคล้ายกันและตั้งขอบเขตได้ละเอียดกว่า
ข้อควรระวังก่อนกด
คำสั่ง /forge gen ยกเลิกกลางคันไม่ได้ ไม่มีคำสั่งหยุด ทางเดียวคือรีสตาร์ทเซิร์ฟ ถ้าเผลอสั่งเป็นแสน chunk ตอนมีคนเล่น จะแก้ไม่ได้เลยนอกจากเตะทุกคนออก
- สั่งตอนไม่มีใครออนไลน์ ระหว่างทำเซิร์ฟจะค้างเป็นช่วง ๆ ครั้งละหลายวินาที
- แบ่งเป็นล็อตเล็กถ้าจำเป็นต้องทำตอนมีคน จะได้หยุดกดเมื่อไหร่ก็ได้
- เผื่อพื้นที่ดิสก์ วัดได้ราว 10 KB ต่อ chunk - แผนที่รัศมี 5,000 บล็อกกินเพิ่มราว 2.5 GB
- ตั้งขอบแผนที่ด้วย ถ้าไม่จำกัดขอบเขต ผู้เล่นเดินออกไปได้ไม่รู้จบและปัญหาจะกลับมา
วิธีดูว่าเสร็จหรือยัง
อย่าดูจากเวลาที่ไฟล์ region ถูกแก้ล่าสุด เพราะเกมเขียนไฟล์ทุก 45 วินาทีจากการเซฟอัตโนมัติอยู่แล้ว ไม่ว่าจะมี chunk ใหม่หรือไม่ - ผมเคยหลงเชื่อสัญญาณนี้แล้วรายงานผิดว่ายังทำงานอยู่ ทั้งที่จบไปแล้ว
วิธีที่ถูกคือ นับจำนวน chunk แล้วดูว่าเพิ่มขึ้นไหม ถ้าเว้นสัก 30 วินาทีแล้วเลขเท่าเดิม คือจบแล้ว
วิธีง่ายสุดสำหรับคนทั่วไปคือ สั่งซ้ำ - ถ้าพื้นที่สร้างครบแล้ว รอบสองจะจบแทบทันที
สรุป
- เจอ Can't keep up อย่าเพิ่งซื้อ RAM เพิ่ม
- ตรวจ swap, การชนเพดานหน่วยความจำ, load average ให้ครบก่อน
- นับไฟล์ region ที่สร้างใหม่วันนี้ - ถ้าเยอะ คือกำลังสร้างแผนที่สด
- อย่าใช้ TPS ตัดสิน ให้นับ Can't keep up ใน log แทน
- สร้างแผนที่ล่วงหน้าตอนไม่มีคน แล้วอาการหายสนิท
ไม่อยากตั้งค่าเอง? เปิดเซิร์ฟ Minecraft (Java) ผ่านหน้าเว็บได้เลย