How to Fix Minecraft Server Lag & TPS Drops (2026 Guide)
Running a Minecraft server for your community or friend group is awesome—until the block breaking delay starts, mobs freeze in mid-air, and the console spits out:
[WARN] Can't keep up! Is the server overloaded? Running 4532ms or 90 ticks behind
Minecraft servers operate on a target heartbeat of 20 Ticks Per Second (TPS). Whenever a tick takes longer than 50 milliseconds (50ms MSPT), TPS collapses, causing unbearable rubber-banding and desync.
In this guide, we break down the exact, step-by-step optimization protocol used by high-performance servers to maintain a locked 20.0 TPS even under heavy load.
1. Diagnose First: TPS vs. MSPT
Before blindly tweaking configuration files, determine whether your bottleneck is CPU speed, RAM garbage collection, or excessive entity ticking.
Use Spark Profiler (Recommended)
If you are running Paper, Purpur, or Fabric, install the spark profiler plugin/mod:
# Run a 3-minute CPU and tick profiler
/spark profiler --timeout 180
# View real-time memory and tick health
/spark health --memory
- TPS (Ticks Per Second): Should always be close to
20.0. Anything below18.0indicates noticeable gameplay lag. - MSPT (Milliseconds Per Tick): The true metric of server health.
< 40ms: Plenty of headroom.40ms – 50ms: Near capacity.> 50ms: Server is dropping ticks and lagging.
2. Upgrade to High-Performance Server Software
Running the default Mojang vanilla or craftbukkit server software is the #1 cause of server performance issues. Modern forks offer massive asynchronous optimizations:
| Server Software | Best For | Async Chunk Loading | Plugin Support |
|---|---|---|---|
| PaperMC | Production servers, SMPs | ✅ Yes | Spigot / Bukkit |
| Purpur | High customization & extra performance | ✅ Yes | Spigot / Paper / Purpur |
| Fabric + Lithium | Modded servers retaining vanilla mechanics | ✅ Yes | Fabric Mods |
[!TIP] PaperMC re-engineers chunk generation, light recalculations, and mob pathfinding to run across multiple CPU threads instead of locking the main thread.
3. Apply Modern Aikar JVM Startup Flags
Standard Java arguments often cause long Garbage Collection (GC) pauses where the server freezes for 2–5 seconds. Use Aikar's tuned G1GC startup flags tailored for Minecraft:
java -Xms6G -Xmx6G \
-XX:+UseG1GC \
-XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions \
-XX:+DisableExplicitGC \
-XX:+AlwaysPreTouch \
-XX:G1NewSizePercent=30 \
-XX:G1MaxNewSizePercent=40 \
-XX:G1ReservePercent=20 \
-XX:G1HeapWastePercent=5 \
-XX:G1MixedGCCountTarget=4 \
-XX:InitiatingHeapOccupancyPercent=15 \
-XX:G1MixedGCLiveThresholdPercent=90 \
-XX:G1RSetUpdatingPauseTimePercent=5 \
-XX:SurvivorRatio=32 \
-XX:+PerfDisableSharedMem \
-XX:MaxTenuringThreshold=1 \
-jar paper.jar --nogui
Why -Xms and -Xmx Should Match
Always set initial memory (-Xms) and maximum memory (-Xmx) to the exact same value. This prevents the Java Virtual Machine from constantly re-allocating memory during gameplay spikes.
4. Key Configuration Tweaks for Paper & Purpur
A. Reduce Simulation Distance (server.properties)
Separating view distance (what players see) from simulation distance (where entities tick) is the single biggest performance booster in modern Minecraft.
# server.properties
view-distance=10
simulation-distance=4
Setting simulation-distance=4 cuts CPU entity load by up to 60% while players can still view beautiful horizons at distance 10.
B. Optimize Entity Activation Range (config/paper-world-defaults.yml)
Entities (villagers, monsters, animals) consume substantial processing power when pathfinding.
entities:
activation-range:
animals: 16
monsters: 24
raiders: 32
misc: 8
water: 8
villagers: 16
flying-monsters: 32
tick-rates:
sensor:
villager:
secondarypoisensor: 40
behavior:
villager:
validatenearbypoi: 40
C. Disable Async Chunk Over-Loading
In config/paper-global.yml:
chunk-loading:
min-load-radius: 2
max-concurrent-loads: 4
5. Pre-Generate Your World Chunks
When players explore with an Elytra or boat, the server is forced to generate terrain, caves, trees, and structures on the fly. This brings even the most powerful CPU to its knees.
Solution: Use Chunky
Install the Chunky plugin/mod and pre-generate a border radius before opening the server:
# Set the world center
/chunky center 0 0
# Set a 5,000 block radius border
/chunky radius 5000
# Start pre-generation
/chunky start
Run this overnight once. When players explore within the 5,000 block radius, chunk loads will be virtually instantaneous off disk storage.
6. Hardware Matters: Single-Core Frequency & NVMe
Minecraft is fundamentally a single-threaded game loop. A high core-count CPU with low clock speed (like old dual Xeon servers) will perform significantly worse than a modern processor with high single-core IPC (such as AMD Ryzen 9 or AWS Graviton3/4 ARM64 instances).
Minimum Hardware Checklist for 20 Players:
- CPU: Modern high IPC processor (AMD Ryzen 7000/9000, Intel 13th/14th Gen, or AWS Graviton 3/4)
- RAM: 6GB–8GB DDR5 with Aikar Flags
- Disk: NVMe SSD with minimum 2,500 MB/s read/write
Summary Checklist
| Optimization Step | Estimated TPS Gain | Difficulty |
|---|---|---|
| Switch to Paper / Purpur | +4 to +8 TPS | Easy |
Set simulation-distance=4 |
+3 to +6 TPS | Easy |
| Pre-generate world with Chunky | Eliminates lag spikes | Medium |
| Apply Aikar G1GC JVM Flags | Eliminates GC freezes | Easy |
| Tune Entity Activation Ranges | +2 to +4 TPS | Medium |
If you'd rather not spend hours tuning config files, managing port-forwarding, or paying monthly fees for servers sitting idle, AetherRuin automatically provisions pre-tuned, high-performance game servers on your own cloud with zero-lag defaults and auto-shutdown.