How to Fix Low TPS and Server Lag in Minecraft
Fix low TPS (ticks per second) and server-side lag in Minecraft. Covers entity optimization, chunk loading, plugin profiling, and JVM tuning for 1.21+.
How to Fix Low TPS and Server Lag in Minecraft
The Problem
[Server] Can't keep up! Is the server overloaded? Running 5012ms or 100 ticks behind
[Server] Current TPS: 14.2
TPS stands for Ticks Per Second. A healthy Minecraft server runs at 20 TPS, meaning it processes one game tick every 50 milliseconds. When TPS drops below 20, players experience block lag (blocks reappear after breaking), delayed item pickups, rubber-banding, and unresponsive NPCs. Server lag is different from client FPS lag: it affects all players equally because the server itself is falling behind.
Quick Fix
Install Spark (/spark profiler start) and run it during peak load for 5 minutes. The profiler report identifies exactly what consumes server tick time. Address the top offender first, usually entity ticking or a specific plugin.
Step-by-Step Diagnosis
- Measure current TPS. Run
/spark tpsor/tps(Paper). Note the 1-minute, 5-minute, and 15-minute averages. If all three are low, the issue is constant. If only the 1-minute average dips, the issue is intermittent (triggered by specific events). - Profile with Spark. Run
/spark profiler start. Wait 5 minutes during peak player activity. Run/spark profiler stop. Open the generated link and examine the "Server Thread" tab. The percentage column shows how much tick time each method consumes. - Check entity count. Run
/spark tickmonitorand look at entity tick times. Use/paper entity listto see entity counts per chunk. A single chunk with hundreds of mobs (a mob farm) can tank TPS. - Review plugin timings. In the Spark report, expand the plugin methods. If a plugin's event handlers appear near the top, that plugin is the bottleneck.
- Check chunk generation. If players are actively exploring, new chunk generation dominates tick time. Pre-generate the world with Chunky:
/chunky radius 5000then/chunky start. - Test without plugins. Stop the server, move the
plugins/folder, and restart. If TPS is 20 with no plugins, add them back in groups of 3-4 until TPS drops. This isolates the problematic plugin. - Check garbage collection. Run
/spark gcto see GC frequency and pause times. If GC pauses exceed 50ms, you need to tune JVM flags or allocate more RAM.
Configuration Optimizations
paper-world-defaults.yml
spawn-limits: monsters: 50, animals: 8, water-animals: 3, ambient: 1per-player-mob-spawns: trueentity-activation-range: monsters: 24, animals: 16, misc: 8tick-inactive-villagers: falsealt-item-despawn-rate: enabled: truewith rates for cobblestone, dirt, netherrack, etc.hopper.disable-move-event: trueredstone-implementation: alternate-current
server.properties
view-distance=8simulation-distance=6max-playersset to your actual expected peak, not 1000
Common Causes
- Entity overload. Mob farms, item sorters, and unloaded mob grinders are the top TPS killers. Each entity is ticked every server tick.
- Poorly written plugins. Synchronous database queries, heavy event listeners, and unoptimized scheduled tasks drag tick time above 50ms.
- Chunk generation during gameplay. Each new chunk takes 20-100ms to generate. Multiple players exploring simultaneously causes severe TPS drops.
- Hopper and redstone machines. Vanilla hopper ticking is extremely expensive. Paper's
disable-move-eventandalternate-currentredstone reduce this significantly. - Insufficient single-core CPU performance. Minecraft's main thread is single-threaded. Clock speed matters more than core count. A 5 GHz CPU with 4 cores outperforms a 3 GHz CPU with 16 cores for Minecraft.
FAQ
What is the acceptable TPS range?
20 TPS is perfect. 18-19 TPS is fine for most players. 15-17 TPS is noticeable but playable. Below 15 TPS is unacceptable and causes severe lag.
Does adding more RAM fix low TPS?
Only if the server is garbage-collecting aggressively due to insufficient heap. Adding RAM to a server that already has enough does not improve TPS and can actually hurt it by increasing GC pause times.
Can I run Minecraft on multiple cores?
Paper and Folia split some work across threads (chunk loading, async tasks), but the main game tick is single-threaded. Folia takes this further by ticking different regions on separate threads, but it requires plugin compatibility. For standard Paper, single-core speed is the key metric.
How do I find which chunks are causing lag?
Use /spark tickmonitor and watch for chunks that consistently appear in high-tick-time reports. You can also use /paper entity list to find chunks with abnormally high entity counts.
Need a server that handles all this? Astroworld Hosting, NVMe SSDs, Pterodactyl panel, DDoS protection on every plan.