วิธีเปิดเซิร์ฟ Minecraft ให้ลื่น ค่า TPS 19+

ข้อมูลเกี่ยวกับการเปิดเซิฟเวอร์ Minecraft ในปัจจุบันให้ลื่น [อัพเดท 2022]

** CPU Core เยอะ ไม่ได้ช่วยทำให้เซิร์ฟลื่นขึ้นแต่อย่างใด แต่ช่วยให้ Process ในการ Restart , Run Server หรือโปรแกรมในเครื่องได้หลายหน้าต่างมากขึ้นและเร็วขึ้นเท่านั้น
** Minecraft Server with JRE จะใช้เพียง CPU 1 Core เท่านั้น ไม่ว่าจะ 8,12 core 16, 32 theads ไม่มีประโยชน์ถ้าคุณใช้เพียงเพื่อรัน Server 1 Process เท่านั้น ไม่ได้รันแยกหลาย Process ก็ไม่มีประโยชน์
การรันแยกหลายการทำงานหรือแยก Process คือ ?
Lobby รัน 1 Process และ spawn ก็รัน 1 Process แมพสร้างบ้านก็อีก 1 Process แยกออกมาไม่กระจุกอยู่ที่ server jar ที่เดียว อันนี้จึงจะมีประโยชน์กับเซิฟเวอร์ที่มีหลาย Core
ยกเว้นใช้ [JDK Muticore] นี่คือปัญหาครับ ให้เน้นไปที่ Clockspeed สูงๆ ตั้งแต่ 2.8 ขึ้นไป(GHz) ดูค่า Tuborboot และนอกจากนี้ให้ดูประสิทธิภาพด้วยครับว่า Single Thread ของ CPU ตัวนั้นเยอะแค่ไหน ยิ่งน้อยก็ยิ่งทำให้เซิร์ฟเวอร์รองรับคนได้น้อยลง เมื่อมันทำหน้าที่ของมันจนเต็มเกินกว่าจะรับไหวจึงทำให้เกิดการ overload
Ram ให้เน้นรองลงมา ไม่ค่อยจำเป็น เว้นแต่จำเป็นต้องใช้ plugin เยอะ หรือ รันหลายๆตัวเซิร์ฟ ทั่วไป ใช้ 8 - 16 gb เน้นเลือกใช้งาน DDR4 ขึ้นไปจะให้ประสิทธิภาพที่ดีกว่า ดู Bus ด้วยว่าวิ่งเท่าไหร่ แนะนำไม่น้อยกว่า 2133 MHz ***DDR3 ยังใช้งานได้แต่ก็จะไม่เร็วเท่า DDR4 DDR5
พื้นที่หน่วยเก็บข้อมูลแนะนำให้ใช้ SSD ขึ้นไป ในปัจจุบันมีหลากหลายรูปแบบ เร็วที่สุดจะเป็น SSD NVME หรือ PCI SSD สามารถเลือกใช้ได้ครับ

** การเลือกเช่าเครื่อง
ผู้ให้บริการส่วนใหญ่ จะไม่บอก Spec CPU ให้กับคุณ จะแจ้งเพียง จำนวน core กับ ram เท่านั้น ให้สอบถามไปยังผู้ให้บริการก่อนเช่าว่าต้องการความเร็วเท่าไร สามารถปรับแต่งได้หากผู้ให้บริการนั้นมีระบบรองรับ
ก่อนเช่าให้ถาม Spec CPU ทุกครั้ง เช็ค Clockspeed , Single Thread ว่าวิ่งเยอะแค่ไหน ซึ่งผู้ให้บริการส่วนใหญ่มักจะเอา CPU Core เยอะๆมาให้ แต่ไม่ได้ช่วยมากเท่าไหร่เพราะอาจจะเป็น CPU รุ่นเก่ามากแล้วที่ประสิทธิภาพสู้รุ่นใหม่ไม่ได้ต่อให้ GHz สูงก็ไม่มีประโยชน์เท่าไร เว้นแต่จะใช้ระบบ BungeeCord แล้วรันแยกหลายๆเซิร์ฟการ การใช้หลาย Core จึงจะมีประโยชน์สูงสุด
เช็ค CPU ได้จากเว็บทั่วไปเช่น https://www.cpubenchmark.net

วิธีแก้ไขที่ปลายเหตุคือ ปรับระยะการมองเห็น และ Monster , mobs ให้น้อยลง วิธีนี้จะไม่ค่อยเวิร์คแต่ก็สามารถช่วยได้แต่จะทำให้ผู้เล่นบางคนหมดความสนุกลงเล็กน้อย [แมพมองเห็นนิดเดียวนั่นแหละ]
ปรับระยะการมองเห็นที่ไฟล์ spigot.yml > world-settings
- view-distance: 4 // ต่ำสุด 4 ดีมาก 8 ปานกลาง 10+ พอใช้ [ยิ่งปรับต่ำเซิร์ฟยิ่งลื่นขึ้น แต่แลกกับผู้เล่นไม่ค่อยชอบ] แต่ผมใช้ 10
- mob-spawn-range: 6 [4-8]// ปรับให้เกิดไกล้ๆผู้เล่นในกรณีที่มอนเตอร์เกิดน้อยเกินไปจะช่วยให้เหมือนมีมอนเตอร์เกิดเยอะ
bukkit.yml ปรับการเกิดของมอนเตอร์
spawn-limits:
monsters: 5
animals: 5
water-animals: 5
ambient: 5
// คือ ประเภทละ 5 ตัว mob มีกี่ประเภทก็คูณไป [เช่น zombie จะเกิดในเซิร์ฟไม่เกิน 5 ตัว , คีปเปอร์เกิดไม่เกิน 5 ตัว เป็นต้น] ถ้าเซิร์ฟเล็กควรปรับน้อย ถ้าไม่ซีเรียส ก็ประมาณ 15

Plugin Spigot แนะนำ
จำกัดมอนเตอร์สำหรับฟาร์ม
https://www.spigotmc.org/resources/farm-limiter.1419/

จำกัดมอนเตอร์ทั้งเซิร์ฟถ้าเกิดเกินจะฆ่าส่วนเกินทิ้ง
https://www.spigotmc.org/resources/mob-farm-manager-supports-1-7-10-up-to-1-17-hopper-support.15127/

ทำให้มอนเตอร์ Stacks กัน ช่วยได้มากเลยบอกก่อน
ก็ถ้าคนนึง ทำฟาร์มไก่ 100 ตัว เล่น 10 คนก็ 1000 ตัว ก็จะเกิดอาการ LAG MOD ตัวนี้จะช่วยให้มันมีแค่ตัวเดียว แล้วมีเลขบนหัวแทน ผสมพันธ์ุได้ตามปกติ
https://www.spigotmc.org/resources/stackmob-enhance-your-servers-performance-without-the-sacrifice.29999/

** Plugin ไม่ได้กิน CPU เป็นหลัก มันชอบกิน Ram มากกว่า [แล้วแต่บางตัวด้วย]
- หากใช้ papermc ก็สามารถ tim เช็คได้ /timings report
ว่าตัวไหนกินทรัพยากร ที่บางคนบอกให้ลด plugin ต้องดูด้วยว่า plugin นั้นทำอะไร เช่น Citizens ที่คนบอกว่าแล็คเนี่ย ตัวนี้มันอยู่ในขอบเขตของ mob เช่นกัน สร้าง npc 1 ตัว สมมัติว่าเป็นแพนด้า mobs ก็เหมือนมีmobs รวมอยู่ในตัวเดียวเป็น 48 ตัว ก็คือกินทรัพยากร CPU เป็นหลัก ใช้ /lagg chunk เช็คดูได้ แต่ไม่สามารถลบทิ้งได้ต้องลบ NPC
แก้ไขปัญหาจากต้นเหตุ คือ Sourcecode ตัว Spigot papermc หรืออื่นๆ ให้สามารถเรียกใช้งาน Multicore CPU ได้ด้วยก็จะลดปัญหาตรงนี้ลงจะเป็นการแก้ไขปัญหาที่ถูกต้องที่สุดครับ
ถ้าเซิร์ฟไม่ได้มีผู้เล่นมากมายนัก ก็อย่ารีบอัพเกรดเครื่อง ค่อยๆอัพเกรดตามจำนวนผู้เล่นจะดีกว่าครับ ภาพตัวอย่างคือแก้ไข Src ให้ใช้งานแบบ Multicore CPU 1.15.2 ด้วย Java JDK
อีกอันอันนี้ช่วยได้เช่นกันครับ สำหรับคนที่ไม่สะดวกย้ายเครื่อง หรือ จำเป็นต้องแก้ไข TPS ตกชั่วคราว ใช้ plugin clearlag ไปที่ config.yml > tps-meter // enabled: false เปลี่ยนเป็น true
==========================
tps-trigger: 16.0
tps-recover: 19.0
commands:
- gamerule doMobSpawning false
recover-commands:
- gamerule doMobSpawning true
==========================
เมื่อ tps ต่ำกว่า 16 สั่งให้หยุด spawnmobs
gamerule doMobSpawning false
เมื่อ tps ขึ้นกลับคืนไป 19 [ปรับเป็น 20 ได้] ให้สั่ง spawnmobsใหม่
gamerule doMobSpawning true
จะเป็นการลดภาระการ spawnmob เกินความจำเป็น เมื่อ Mob ตายจนถึงจุดหนึ่งจนเซิร์ฟเริ่มกลับมาทำงานตามปกติก็จะสั่ง spawnmob ใหม่

** Code Run server ใช้แบบไหนถึงจะดี
เราจะมาพูดถึงการกำหนด ram ซะก่อน
ตัวอย่างผมมีRam 32 GB ผมจะใช้โค๊ดนี้ในการรัน
Xmx คือ จำนวนหน่วยความจำ(RAM) สูงสุดที่สามารถใช้งานได้ ควรตั้งให้น้อยกว่าทีมี เช่นมี 8 GB ควรตั้งเพียง 6GB
Xms คือ บังคับใช้หน่วยความจำขั้นต่ำ ไม่แนะนำให้ใส่ผมจะตั้ง
ให้ระบบใช้อัตโนมัติเมื่อจำเป็น หากต้องการก็ใช้ได้ แนะนำให้ตั้งไว้ 1/4 ของ Xmx เช่น -Xms2G -Xmx8G
การตั้ง Xms กับ Xmx เท่ากันจะสงผลเสียระยะยาว ทำให้เกิด Crashed เมื่อรันเซิร์ฟเวอร์เป็นเวลานาน เหมือนเป็นการสั่งให้ทำงานโดยไม่มีงานให้ทำนั่นแหละรวน
====================================
@echo off
cls
echo This script will keep your server running even after crashing!
title Minecraft 1.15.2
:StartServer
start /wait java -Xmx30G -d64 -Dfile.encoding=UTF-8 -jar paper-112.jar -o true -nogui
echo (%time%) Server closed/crashed... restarting!
goto StartServer
====================================
** สงสัยไช่ไหมว่าทำไมไม่ใส่ 32G เพราะว่าอย่าลืมหากใช้
Windows Server ในการเปิด Ram จะถูกระบบปฎิบัติการนำไปใช้อย่างน้อย 2GB เราจึงใส่ไว้ที่ 30 เพื่อที่ไม่ให้เกิดอาการ Crashed เพราะหากตั้งไว้ 32GB แล้ว เซิร์ฟเวอร์ใช้งานจนถึง 32G + windows ใช้อีก 2 GB ก็ไม่พอสิครับ เกิดอาการ Crashed ก็คืออยู่ๆเซิร์ฟก็ปิดตัวเองลง
Code ด้านบนนอกจากรันเซิร์ฟแล้วก็จะคอยเช็คว่าเซิร์ฟดับหรือไม่ หากดับก็จะรันใหม่ในกรณีที่เราไม่อยู่ หรือเซิร์ฟเวอร์ Restart ตัวเอง
สามารถเพิ่มโค๊ดด้านล่างใส่เข้าไปเพิ่มได้ ดูเอาตามความเหมาะสม
1.UseG1GC คือ ทำการจัด heap memory ที่ว่างเอาไว้เป็นกลุ่มหลังจากที่ได้พื้นที่ว่างคืนมา
=====================================
-noverify -XX:+UseG1GC -server
=====================================
2.XX:+UseParallelOldGC คือ ปรับปรุง algorithm ให้ทำงานได้ดีกว่าเดิม เหมาะสำหรับ Server ที่มีหลาย Core
3. -XX:+UseParallelGC คือ สำหรับเซิร์ฟเวอร์ที่มี CPU มากกว่า 1 Core มีปัญหาเรื่อง รันคำสั่งจำนวนมากและใช้เวลานาน ปกติจะถูกเลือกใช้เป็นค่า default อยู่แล้ว
4. -XX:+UseSerialGC คือ ทุกอย่างจะหยุดทำงานเมื่อรันคำสั่งใหญ่ๆ เช่น worldedit ก็คือจนกว่าจะ worldedit เสร็จจึงจะรันคำสั่งใหม่ต่อ

เป็นการเปรียบเทียบจากความคิดเห็นส่วนตัวและที่ได้ลองมาจากหลายๆค่ายด้วยวิธีนี้ ได้ผลลัพธ์ที่พอใช้ตัดสินใจได้
อ่านเพิ่มเติม Config Java
https://medium.com/@phayao/jvm-options-เบื้องต้นมีอะไรบ้าง-2564f5690142
ดูคะแนนตรง Single Thread Rating
ไม่ควรต่ำกว่า 1900
Version : 1.14+ || TPS : 20
==============================
1000-1200 : 2-3 Player
1201-1500 : ~5 Player
1501-1900 : 6-10 Player
1901-2100 : 15-20 Player
2101-2500 : 17-25 Player
2501-2700 : 25-35 Player
2701-3000 : 27-40 Player
3001-3300 : 34-45 Player
มากกว่านี้ แนะนำให้ทำระบบข้ามเซิร์ฟเวอร์แทนนะครับ
- กล่าวคือ spawn เป็น 1 Server แมพสร้างบ้านก็อีก 1 Server
ทำให้สองเซิร์ฟเวอร์นี้เชื่อมเข้าหากันด้วย ฐานข้อมูล
อันนี้ขั้นสูง จะเป็นการแก้ปัญหาที่ไม่เปลืองงบประมาณอีกเช่นกัน

**Credit กลุ่ม Facebook Minecraft Chanel