Optimization • 2026-08-19 • 7 min read

How to Fix Minecraft Server Lag & TPS Drops: The Ultimate 2026 Optimization Guide

Eliminate Minecraft server lag, fix 'Can't keep up' errors, and maintain a constant 20 TPS with tuned JVM flags, chunk pre-generation, and Paper/Purpur configs.

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 below 18.0 indicates 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.