Troubleshoot and Fix Minecraft Server Performance
Diagnose and fix Minecraft server lag — tune view-distance, pre-generate chunks with Chunky, profile with Spark, switch from Vanilla to Paper, apply Aikar's JVM flags, and cut entity counts. Works on wisp.gg-hosted servers.
Before You Start
Minecraft server lag feels like lag to players, but there are two very different kinds:
- TPS lag (server-side) — the whole server slows down, hit detection is delayed, mobs freeze, commands stall. This is what you fix from the server side.
- Ping lag (client-side) — only some players are affected, others are fine. Usually a network or ISP issue on their end, not yours.
If some players lag but others don't, it's not a server performance issue. Skip this article and check the High Latency / Lag Troubleshooting guide instead.
If everyone is experiencing rubber-banding, delayed hits, or stuck mobs — keep reading.
Step 1: Check Your TPS
TPS (Ticks Per Second) is the heartbeat of your Minecraft server. The game is designed to run at 20 TPS. Below that, everything slows down.
How to check TPS:
- Paper / Purpur / Spigot: In the server console or in-game (as op), run
/tps - Fabric with a perf mod:
/tps(if installed) or check Spark — see Step 5 - Vanilla: Vanilla doesn't have a built-in
/tpscommand. Either switch to Paper (Step 3) or install Spark to measure it.
A healthy server shows 20.0, 20.0, 20.0 (1m, 5m, 15m averages). Anything under 19.0 is lag.
Step 2: Fix the Easy Wins in server.properties
Open File Manager in the wisp.gg panel and edit server.properties. These three settings have the biggest impact on performance:
| Setting | Default | Recommended | Why |
|---|---|---|---|
view-distance |
10 | 8 | Chunks sent to each player. Every +1 is a huge memory + CPU cost. 8 is plenty for survival. |
simulation-distance |
10 | 6–8 | Chunks where mobs tick, crops grow, redstone runs. Lower this aggressively if you're lagging. |
network-compression-threshold |
256 | 512 on modern networks, -1 on LAN | Higher = less CPU spent compressing small packets. |
Restart the server after editing. Check /tps again — for most modded/heavy-populated servers, this alone recovers 3–5 TPS.
You can also use our server.properties generator to build a clean config with tooltips for every setting.
Step 3: Switch from Vanilla to Paper (or Purpur)
This is the single biggest thing you can do. Vanilla Minecraft's server code is not designed for performance at scale. Paper (and its fork Purpur) are drop-in replacements that:
- Run the same plugins as Vanilla (it IS Vanilla, with optimizations)
- Are fully compatible with all vanilla worlds and save files
- Can easily double or triple your TPS on the same hardware
- Expose hundreds of tuning knobs in
paper-global.ymland per-worldpaper-world.yml
To switch on wisp.gg:
- Stop your server
- In the Startup tab, find the "Server Jar File" or "Paper Version" variable
- Select Paper (or Purpur if you want extra features) matching your current Minecraft version
- Start the server — it will auto-download the Paper jar
Paper is a true superset of Vanilla — you lose nothing and gain everything. There's no reason to run Vanilla in production.
Modded servers: Paper doesn't work with Forge/NeoForge/Fabric mods. For modded servers, stay on your mod loader but apply the other steps in this guide.
Step 4: Pre-Generate Your World with Chunky
Every time a player walks into un-generated terrain, the server has to generate that chunk — heavy CPU work that blocks the main thread and drops TPS. Pre-generating the whole playable area once fixes this permanently.
Install Chunky:
- Paper/Purpur: Download the
.jarfrom CurseForge or Modrinth and drop it in/plugins/. Restart. - Fabric: Install the Fabric version of Chunky as a mod.
Pre-generate a border of 5,000 blocks (25km²) around spawn:
/chunky radius 5000
/chunky start
Chunky will generate chunks in the background at a controlled rate. Expect this to take 15 minutes to several hours depending on your plan's CPU and the radius. You can leave it running — it auto-pauses when TPS dips.
Check progress:
/chunky status
Set a world border at the pre-generated edge so players can't walk into un-generated territory:
/worldborder set 10000
/worldborder center 0 0
One-time cost, permanent fix. Do this before advertising your server.
Step 5: Profile with Spark
Once the easy fixes are applied, if you're still lagging you need to know what is causing it. Spark is the tool.
Install Spark:
- Paper/Purpur: Download the plugin
.jarfrom Spark's downloads page and drop it in/plugins/. Restart. - Fabric/Forge: Install the matching mod version from the same page.
Run a profiler for 2 minutes while you reproduce the lag:
/spark profiler --timeout 120
When it finishes, Spark uploads the report and gives you a link. Open it in a browser and you'll see:
- Which methods are eating CPU (usually mods, plugins, or specific blocks)
- Which thread is the bottleneck (almost always the main server thread)
- Hotspots ranked by percentage of tick time
Look for red flags:
- A single plugin using >20% of tick time → disable it, contact the plugin author, or find an alternative
- A mob/entity class using >10% → too many of that entity (see Step 6)
- Chunk I/O dominating → pre-generate (Step 4) or get faster storage
Useful Spark commands:
| Command | What it does |
|---|---|
/spark profiler --timeout 120 |
Run a 2-minute profiler |
/spark tps |
Detailed TPS breakdown per-tick |
/spark tickmonitor |
Live monitor of slow ticks as they happen |
/spark healthreport |
Summary of CPU, memory, and GC health |
/spark heapsummary |
Memory usage by object type (find memory leaks) |
Step 6: Clear Excess Entities
Dropped items, passive mobs, and player-built farms pile up over time. A single oversized mob farm can tank your TPS for the whole server.
Find how many of each entity exist:
/minecraft:data get entity @e[type=item,limit=1]
or with Essentials/EssentialsX:
/lagg chunk
Nuclear option — clear all dropped items (safe, but pickups vanish):
/kill @e[type=item]
Clear all non-player entities (wipes pets, villagers, animals — use with care):
/kill @e[type=!player]
Clear only items in a specific range:
/kill @e[type=item,distance=..50]
For recurring cleanup, install a plugin like ClearLag or configure Paper's built-in entity activation range in paper-world.yml to only tick entities near players.
Step 7: Tune JVM Flags (Aikar's Flags)
Minecraft runs on the JVM, and default JVM settings are not tuned for a game server. Applying Aikar's flags is a well-known set of G1GC tweaks that dramatically reduce GC pauses.
In wisp.gg:
- Stop the server
- Go to the Startup tab
- Find the Java Flags or JVM Arguments variable
- Paste Aikar's flags:
-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -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 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true
- Start the server
These flags tell the JVM to keep GC pauses under 200ms and pre-touch allocated memory — both of which smooth out TPS dips during garbage collection.
Don't apply Aikar's flags to servers with less than 4 GB of RAM — some of the tuning assumes ≥ 4 GB. For 1–2 GB servers, stick with the defaults.
Step 8: Mod & Plugin Triage
If you're running a heavy modpack, the issue is usually one bad mod — not 200 of them.
Binary-search to find the culprit:
- Back up your server files (always)
- Disable half your mods (rename
/mods→/mods-disabled, create new/modswith half the jars) - Start, test, run
/tps - If TPS improved, the offender is in the disabled half; otherwise the active half
- Bisect from there until you find the mod
Common troublemakers:
- Mods adding aggressive random-tick mechanics (weather, insects, plant growth)
- Mods adding hundreds of entities per chunk (extra mob mods)
- Mods with known performance issues — check the mod's CurseForge comments
- Mismatched mod versions between server and players → disconnects, chunk desync, perceived lag
Step 9: Enough Hardware?
If you've done everything above and you're still below 20 TPS, you're out of hardware. Check the wisp.gg Dashboard for your CPU and RAM meters:
- CPU pinned at 100% — you need faster cores or fewer players/mods. Minecraft is single-threaded per world, so it's all about single-core speed.
- Memory consistently above 80% — you need more RAM. Modded servers often need 8–16 GB.
Rough RAM guidelines:
| Server Type | Players | Recommended RAM |
|---|---|---|
| Vanilla/Paper | 1–10 | 2–4 GB |
| Paper with plugins | 10–30 | 4–8 GB |
| Light modpack (50–100 mods) | 5–15 | 6–10 GB |
| Heavy modpack (200+ mods) | 5–15 | 10–16 GB |
| Sky-factory / tech-heavy modpacks | 5–15 | 12–20 GB |
Upgrade your plan in the billing portal or ask on Discord — we can help size it right before you commit.
Quick Checklist
-
/tpssays 20.0 (if not, keep reading) -
view-distanceset to 8,simulation-distanceset to 6–8 - Running Paper or Purpur (not Vanilla)
- World pre-generated with Chunky + world border set
- Spark installed and profiler run to find hotspots
- Entity counts sanity-checked, excess items cleared
- Aikar's flags applied (if ≥ 4 GB RAM)
- Mod triage done if you're running a modpack
- CPU and RAM graphs on dashboard are healthy
Related
- Setting Up a Minecraft Server — first-time configuration
- server.properties Generator — build a tuned config with tooltips
- Connecting a Custom Domain — route players via a clean URL
- WISP: Automatic Modpack Installation — how we install modpacks for you
Still lagging after all this? Hop into Discord with a Spark profile link and we'll take a look.