Lag & TPS drops
When the redstone stops ticking, mobs teleport, and players see "Server can't keep up!" in the console — it's TPS, not ping. This guide explains the difference, profiles your actual bottleneck, then walks the fixes that move the needle (and the ones that don't).
TPS vs ping — they're different things
"Lag" is two completely separate problems that get confused constantly:
- Server-side lag (TPS drops). The server can't process its tick loop fast enough. Symptoms: mobs frozen or teleporting, hits not registering, blocks placing then snapping back. Affects every player simultaneously.
- Network lag (high ping). Packets take too long between client and server. Symptoms: you see rubber-banding but other players are fine, your ping bars are yellow/red. Affects individuals.
This guide covers the first kind. If only some players are affected, see Can't connect errors instead.
TPS basics
Minecraft runs a 20-tick-per-second simulation loop. Each tick has 50 milliseconds (MSPT) to do its work — process mobs, run redstone, simulate liquids, save chunks, etc. If a tick takes longer than 50 ms, TPS drops below 20 and the server is "behind."
Check current TPS via the console:
> tps
[Server] TPS from last 1m, 5m, 15m: 20.00, 19.87, 18.23
[Server] MSPT: 38.4ms
Read it like this:
- 20.0 — perfect, no work to do here.
- 18–19.9 — minor jitter, usually fine.
- 15–18 — noticeable. Mobs feel slow.
- under 15 — players see rubber-banding, redstone breaks.
MSPT under 50 ms = 20 TPS. MSPT 100 ms = 10 TPS, etc. Use MSPT when you need a finer signal than the TPS number.
Step one: profile, don't guess
Don't change a single setting until you know what's eating ticks. The single most useful Minecraft tool ever made is Spark — a profiler that tells you exactly which mod / plugin / chunk is the culprit.
Install it like any other plugin or mod (it works on Paper, Fabric, Forge, NeoForge — pick the right loader) — see Adding plugins or Adding mods.
Then, when you're lagging:
> spark profiler start
Profiler started. Run "spark profiler stop" when finished.
(wait 30-60 seconds while the lag is happening)
> spark profiler stop
Profiler stopped. Uploading...
View at: https://spark.lucko.me/abcdef123
The link gives you a flame graph of every mod / plugin sorted by CPU time. The top 3 entries are responsible for 95% of your lag.
spark tickmonitorRuns in the background and announces in the console every time a tick goes over your threshold, naming what spiked. Great for "random" lag that happens once an hour.
The usual suspects
Too many entities
Cows, zombies, dropped items, armor stands — every entity costs roughly the same per tick. A mob farm dumping 200 zombies a minute will TPS-strangle even a Diamond plan. Find them with:
> forge entity list (Forge/NeoForge)
> fabric entity list (Fabric)
> minecraft:entities count (vanilla 1.21+)
> spark heapsummary (cross-loader)
Fixes:
- Cap entities-per-chunk in
paper-world-defaults.yml→entities.spawning.per-player-mob-spawns: true. - Use
/kill @e[type=item]on a schedule to drop accumulated items. - Mob farms: redesign with hoppers + lava that kills items above ground, or use ClearLagg.
Chunk loaders & spawn chunks
Each loaded chunk costs ticks even when nobody's there. Players with portable chunkloaders (FTB Chunks, FTB Utilities) or stationary ones (Hopper Ducts, Chickenchunks) can keep dozens of chunks awake. Spark's heap summary will show abnormal chunk counts.
For vanilla / Paper: reduce simulation-distance in server.properties from default 10 to 6 or 8. View distance can stay higher — it only affects what's rendered, not what's simulated.
Heavy redstone
Hopper clocks, observer farms, item sorters with 50+ hoppers, and the entire concept of quasi-connectivity are common offenders. Spark will name the chunk; teleport there and look for blinking torches or rapid hopper transfers. Switching to Paper's alternate-current redstone implementation (built in since 1.21) cuts redstone CPU by 5–10×.
Bad plugins / mods
Spark names them. Common worst-offenders to audit first:
- Old anti-cheats — NoCheatPlus, ancient AntiAura builds.
- Big claim plugins on small servers — GriefPrevention with thousands of unused claims.
- Scoreboard / hologram plugins that update every tick — set their refresh interval higher.
- Magic mods that scan every chunk — Botania, Astral Sorcery, Productive Bees.
Under-allocated RAM
Garbage collection pauses look identical to TPS drops. If your RAM bar on the dashboard stays at 95%+, the JVM is spending its time running GC instead of ticking the world. Upgrade your plan — the issue isn't your code, it's the heap.
Tweaks worth applying
Paper / Purpur
If you're on Paper or Purpur (recommended), edit config/paper-world-defaults.yml:
chunks:
auto-save-interval: 6000 # save every 5 min, not every tick
max-auto-save-chunks-per-tick: 8
entities:
spawning:
per-player-mob-spawns: true
mobs-can-always-pick-up-loot:
zombies: false
skeletons: false
ticks-per:
hopper-transfer: 8 # default 8, tune up if hoppers eat ticks
hopper-check: 8
server.properties
view-distance=8— default 10. Doesn't affect render, only entity tracking range. 8 is usually fine.simulation-distance=6— default 10. Bigger savings than view distance.network-compression-threshold=256— small saves on bandwidth, no TPS impact.
Pre-generate the world
First-time chunk gen is expensive. Tools like Chunky (Paper) or Chunk Pregenerator (Forge/NeoForge) let you generate a square of chunks around spawn while the server is empty. Once it's done, players never trigger fresh gen and your TPS stops dipping when someone walks into uncharted land.
> chunky world world
> chunky radius 5000
> chunky start
Scheduled nightly restart
Long uptimes accumulate small leaks — orphaned entities, JVM fragmentation, plugin memory drift. A daily 4 AM restart is the cheapest performance fix on the menu. See Schedules for the cron syntax.
Tweaks that don't help
- "More RAM is always better." Past 8–10 GB, GC pauses get longer, not shorter. The right answer is "as much as you need," not "as much as possible."
- JVM flag voodoo. Aikar's flags help, but the difference between Aikar and default on modern Java is <5%. Anything else from 2014-era forum posts is obsolete.
- Custom Java versions. The panel ships a tuned Java for each MC version. Replacing it almost always makes things slower.
Profile, fix the named offender, profile again. Open a ticket with your Spark link and we'll happily look over it.