Minecraft Server Lag: Check TPS and MSPT, Then Find the Cause
A Minecraft server is lagging when its ticks take longer than 50 milliseconds. At 20 ticks per second (TPS) each tick has a 50 ms budget, so a server that averages more than 50 ms per tick (MSPT) falls behind and runs below 20 TPS. The fix is to measure first, find which part of the game is using the time, and change that, not to apply a pile of copied settings.
This guide explains TPS and MSPT, how to use the spark profiler that is built into Paper, and the settings that are documented as affecting performance. It was checked on 2026-11-15 against the Paper and spark documentation. Paper's own advice is to revert pre-made optimisation configs, because they often cause problems, so change one thing at a time and measure.
- 20 TPS is perfect. It needs each tick to take 50 ms or less. Run
/spark tpson the Console tab to see it. - Profile before you tune. On Paper,
/spark profiler start --timeout 300collects five minutes of data./spark profiler stopgives you a report link. - Lag spikes are different from steady lag. To catch spikes use
/spark profiler start --only-ticks-over 100 --timeout 300. - Lower
simulation-distancefirst, then check mob and entity counts, hoppers and plugins. More RAM does not fix a slow tick. - Minecraft's tick loop mostly runs on one thread, so a fast CPU matters more than a high core count.
On this page
What TPS and MSPT mean
- TPS is how many game ticks the server completes each second. The target is 20.
- MSPT is how many milliseconds a tick takes on average. To hold 20 TPS it has to be 50 ms or less.
- A server at 40 ms MSPT is fine, with headroom. A server at 70 ms MSPT cannot keep up and its TPS drops below 20.
Lag also shows up in different ways. Steady lag means most ticks are slow, for example because there are too many entities. A lag spike means a few ticks are very slow, often triggered by one thing a player does, such as a large WorldEdit action. Steady lag points at your settings and builds. Spikes point at events, so they need a different profiling method.
Measure with spark
spark is a performance profiler. Paper includes it, so you do not need to install a plugin. On ChicagoServers, open the Console tab and type the commands without the slash if it prefers that. On a Vanilla server spark is not built in, so lag checks are more limited. Switching to Paper is covered in our server software comparison.
| Command | What it does |
|---|---|
/spark tps | Prints the TPS rate and CPU usage. |
/spark health | Opens a live health report covering TPS, CPU, memory and disk. /spark health show prints a basic one in the console. |
/spark profiler start --timeout 300 | Starts the profiler and stops it automatically after 300 seconds. |
/spark profiler stop | Stops the profiler and shows the results. |
/spark profiler start --only-ticks-over 100 --timeout 300 | Records only ticks longer than 100 ms, which catches spikes. |
/spark profiler start --alloc | Profiles memory allocation instead of CPU use. |
/spark tickmonitor | Reports ticks that run much longer than the average. --threshold-tick 50 reports any tick over 50 ms. |
- Reproduce the lag
Run the profiler while the problem is happening, with players online, not on a quiet server.
spark profiler start --timeout 300 - Open the report
When it finishes, spark prints a link to the report. Open it and look at which parts of the tick use the most time. Plugin names, chunk and entity work show up in the tree.
- Change one thing
Make a single change from the sections below, restart, run the same profile and compare the numbers.
Fixes in a sensible order
- Distances. Lower
simulation-distanceinserver.propertiesfirst, for example to 6 to 8. It sets how many chunks around each player have entities and redstone running.view-distancemostly affects what is sent to players. See server.properties explained. - Plugins. If a plugin name is high in the profiler or in a watchdog stack trace, check for an update for it. To isolate one, disable plugins in halves and test.
- Mobs and entities. Too many animals, villagers and item drops add up. The spawn limits in
bukkit.ymland Paper's per-world settings control natural spawning. - Hoppers and farms. Large hopper lines and redstone clocks are common causes, and Paper has hopper options.
- Pre-generate the world if lag appears when players explore, since generating new chunks is expensive. Our seed guide covers pre-generation.
- Memory and CPU. Check the points below.
Paper settings that are documented to affect performance
Paper keeps its settings in config/paper-global.yml for the whole server and config/paper-world-defaults.yml for all worlds. You can open them on the Files tab. Edit with the server stopped, save, then start it. Only change a value you understand, and note the old value.
| Setting | File | What it does |
|---|---|---|
chunk-loading-basic.player-max-chunk-send-rate | paper-global.yml | Maximum chunks per second sent to a player. Default 75. |
chunk-loading-basic.player-max-chunk-load-rate | paper-global.yml | Maximum chunk load rate per player. Default 100. |
misc.max-joins-per-tick | paper-global.yml | Maximum players joining per tick. Extra players are delayed, not kicked. Default 5. |
entities.spawning.per-player-mob-spawns | paper-world-defaults.yml | Counts the mob limit per player and not for the whole server. Default true. |
entities.spawning.spawn-limits | paper-world-defaults.yml | Per-world caps on natural spawns by mob category. -1 uses the bukkit.yml value. |
collisions.max-entity-collisions | paper-world-defaults.yml | Stops collision processing after this many collisions. Default 8. |
hopper.ignore-occluding-blocks | paper-world-defaults.yml | Hoppers skip containers inside occluding blocks. Default false. |
hopper.disable-move-event | paper-world-defaults.yml | Disables the hopper item move event. Helps performance, but breaks protection plugins that use it. Default false. |
tick-rates.mob-spawner | paper-world-defaults.yml | How often spawners tick. -1 disables all spawners. |
RAM and CPU
- High RAM use is normal. Java uses the memory it is given, and that does not mean there is a leak. See how much RAM a Minecraft server needs.
- Out-of-memory crashes often happen when the memory limit set on the server is too close to the Java heap size. Paper suggests starting by leaving 1 to 2 GB of room.
- CPU: the main tick loop runs on a single thread, so single-core speed matters most. Paper recommends at least 4 threads for the rest of the work.
- If the profiler shows most time in one plugin or one chunk area, more hardware will not help. Fix that first.
Common lag causes
| What you see | Likely cause |
|---|---|
| TPS low all the time | Too many entities or chunks being simulated. Lower simulation-distance and profile. |
| Spikes when players explore | New chunks are being generated. Pre-generate the world. |
| Spikes when someone builds or pastes | A big world edit. Profile with --only-ticks-over. |
| Lag that grows with uptime | Entities or items piling up, or a plugin issue. Check mob counts and profile. |
| Lag near one build | Hoppers, redstone, farms or villagers. Check the hopper settings above. |
| A watchdog message on the console | A tick took 10 seconds or more. The stack trace names what was running. |
| Lag started after an update | A plugin or setting is out of date. Compare with the last backup. |
Running modded? Heavy modpacks need more than these steps. See installing Forge and Fabric mods. Looking for a host? See Minecraft server hosting.
Frequently asked questions
What is a good TPS for a Minecraft server?
20 TPS is perfect and is the maximum. It requires each tick to take 50 milliseconds or less on average.
What is MSPT in Minecraft?
MSPT is milliseconds per tick, the average time the server takes to process one tick. Keep it at 50 ms or below to hold 20 TPS.
How do I check TPS on a Paper server?
Run /spark tps in the Console tab. Paper includes spark, which also provides a profiler and a health report.
How do I find what is causing lag on my Minecraft server?
Run /spark profiler start --timeout 300 while the lag is happening, then open the report link that /spark profiler stop or the timeout gives you. For spikes, add --only-ticks-over 100.
Will more RAM fix Minecraft server lag?
Usually not. A slow tick is mostly a CPU and workload problem. More RAM helps only if the server is running out of memory.
Does lowering view distance reduce lag?
Lowering simulation-distance is usually the bigger win because it reduces how many chunks have entities and redstone running. view-distance mostly affects how much terrain is sent to players.