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).

Troubleshooting Last updated May 19, 2026 ~8 min read

TPS vs ping — they're different things

"Lag" is two completely separate problems that get confused constantly:

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:

console
> tps
[Server] TPS from last 1m, 5m, 15m: 20.00, 19.87, 18.23
[Server] MSPT: 38.4ms

Read it like this:

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:

console
> 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.

Also: spark tickmonitor

Runs 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:

console
> forge entity list                          (Forge/NeoForge)
> fabric entity list                          (Fabric)
> minecraft:entities count                    (vanilla 1.21+)
> spark heapsummary                            (cross-loader)

Fixes:

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:

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:

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

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.

console
> 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

Profile, fix the named offender, profile again. Open a ticket with your Spark link and we'll happily look over it.