แก้เซิร์ฟ 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)เวลาโดยประมาณ
5003,969ราว 5 นาที
1,00015,625ราว 25 นาที
2,00063,001ราว 1 ชม. 45 นาที
5,000393,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 วินาทีแล้วเลขเท่าเดิม คือจบแล้ว

วิธีง่ายสุดสำหรับคนทั่วไปคือ สั่งซ้ำ - ถ้าพื้นที่สร้างครบแล้ว รอบสองจะจบแทบทันที

สรุป

  1. เจอ Can't keep up อย่าเพิ่งซื้อ RAM เพิ่ม
  2. ตรวจ swap, การชนเพดานหน่วยความจำ, load average ให้ครบก่อน
  3. นับไฟล์ region ที่สร้างใหม่วันนี้ - ถ้าเยอะ คือกำลังสร้างแผนที่สด
  4. อย่าใช้ TPS ตัดสิน ให้นับ Can't keep up ใน log แทน
  5. สร้างแผนที่ล่วงหน้าตอนไม่มีคน แล้วอาการหายสนิท

ไม่อยากตั้งค่าเอง? เปิดเซิร์ฟ Minecraft (Java) ผ่านหน้าเว็บได้เลย

คู่มืออื่น