X
X
X
X
All systems operational · 200 Tbps+ DDoS protection active
Sign Up Sign In 08505574494

Minecraft Server Optimization: Fixing Low TPS

HomepageArticlesMinecraft ServerHow to Optimize a Minecraft Server:...
How to Optimize a Minecraft Server: Fixing Low TPS

Optimising a Minecraft server is not about pasting random values into config files — it is about measuring first and then changing one thing at a time: the target is 20.0 TPS and an MSPT below 50 milliseconds per tick, and as long as MSPT stays under 50 ms your server holds 20 TPS. When lag appears, upgrading RAM usually changes nothing, because the cause is almost always one of four things: entity load, chunk generation, redstone, or garbage collection pauses. This guide covers finding the problem and changing the right setting in the right place.

Measure first: what TPS and MSPT tell you

Separating these two numbers is the foundation of all optimisation.

  • TPS (Ticks Per Second): How many ticks the server processes per second. The target is 20.0. Below that, in-game time slows down and players experience it as lag and rubber-banding.
  • MSPT (Milliseconds Per Tick): How long a tick takes to process. The target is under 50 ms, because 20 TPS means a 50 ms budget per tick.

The relationship: as long as MSPT does not exceed 50 ms, TPS stays at 20. Which is why MSPT is the number to watch — by the time TPS starts dropping it is already too late, but at 45 ms you still have room to act.

Another important distinction: if TPS is low but player ping is normal, the problem is server-side processing. If ping is high too, look at the network or location instead.

Minecraft TPS diagnosis table: MSPT threshold, tickEntities load, chunk generation, GC pauses and single-core saturation

Diagnosing with spark: stop guessing

spark is the profiling and monitoring tool for Minecraft servers, and optimisation starts here. Its core commands:

  • /spark tps — current TPS and CPU usage.
  • /spark health — an overall report covering TPS, CPU, memory and disk usage.
  • /spark profiler — samples CPU and memory usage and produces a detailed report, uploaded to an online viewer.
  • /spark tickmonitor — tracks individual ticks exceeding a threshold, ideal for catching spikes.

Two rules for using it properly. First: profile while the lag is happening, not on a quiet server. A report taken on an idle server tells you nothing.

Second, and more important: in the flame graph, a wide branch is not proof that the code is defective — it only shows where sampled time was spent. A plugin may look wide because it is doing the actual work. Always read the graph alongside what players were doing at the time: who was where, which farm was running, was someone flying into new terrain?

The four main causes of low TPS

1. Entity load

If ServerLevel#tickEntities exceeds 40% of CPU usage in the profile, the culprits are mobs, villagers and item piles. The two most frequent sources: villager pathfinding calculations and large hopper arrays.

2. Chunk generation

When a player flies toward ungenerated terrain, the server has to generate chunks and write to disk in real time. MSPT spikes noticeably at those moments. The symptom is clear: lag starts when players explore and is absent during normal play.

3. Redstone

Vanilla redstone triggers cascading lighting and block updates. On servers with large redstone builds it generates serious load on its own.

4. Garbage collection pauses

The symptom is very characteristic: TPS drops recurring at regular intervals — every 30 seconds, for example. That is Java freezing the main thread to clean up memory. The cause is usually not insufficient RAM but a badly sized heap and GC settings.

Config files: which is where?

The most common mistake when following optimisation guides is looking for a setting in the wrong file. Paper has moved away from the old single paper.yml; the current structure is:

  • server.properties — vanilla settings: view-distance, simulation-distance, max-players.
  • bukkit.yml — core Bukkit settings such as mob spawn limits.
  • spigot.yml — Spigot settings such as entity-activation-range and merge-radius.
  • config/paper-global.yml — server-wide Paper settings.
  • config/paper-world-defaults.yml — default values for all worlds.
  • world/dimensions/<namespace>/<key>/paper-world.yml — per-world overrides.

The system works by inheritance: anything not explicitly defined for a world is inherited from paper-world-defaults.yml. So you do not copy the whole configuration into every world — only the exceptions.

The highest-return settings

These deliver most of the gain on most servers. Do not apply them all at once — change one at a time and test under real load.

View and simulation distance

The two values with the largest single impact. view-distance sets how many chunks are sent to the client; simulation-distance sets how many are actively ticked — and the second is the real source of CPU load. On busy servers, 6–8 is a reasonable starting range. Keep simulation distance below view distance: players see distant terrain without those chunks being processed.

Entity activation range

entity-activation-range in spigot.yml determines from what distance mobs start being ticked. Lowering it modestly for animals and monsters reduces load — but going too far makes mobs freeze right in front of players and ruins the feel of the game.

Item merging

Increasing merge-radius slightly for dropped items combines ground piles and reduces entity count.

Collision limits

Paper's max-entity-collisions (default 8) caps collision processing. The only-players-collide option further restricts collision detection to player-involved cases — a visible difference on servers with mob-packing farms.

Hopper settings

Hoppers are a silent TPS killer. Three Paper settings help directly: cooldown-when-full applies a brief delay to full hoppers, ignore-occluding-blocks skips unnecessary container scanning, and disable-move-event — in the documentation's own words — dramatically improves hopper performance. Before enabling the last one, check whether any plugin depends on hopper move events.

Chunk settings

delay-chunk-unloads-by postpones unloading (in duration format such as 10s or 25m) — breaking the constant load/unload cycle in areas players move back and forth through. max-auto-save-chunks-per-tick (default 24) limits how many chunks are saved per tick, smoothing spikes during auto-save.

Redstone engine

Paper lets you change the redstone implementation: VANILLA, EIGENCRAFT or ALTERNATE_CURRENT. Alternative engines produce the same result with more efficient algorithms and make a visible difference on servers with large redstone builds. Test in a staging world first, as behaviour can differ.

Others

optimize-explosions reduces the computation involved in explosions. update-pathfinding-on-block-update controls whether mob navigation is recalculated on every block update — worth reviewing on villager-heavy servers.

Memory and garbage collection

If you see TPS drops at regular intervals, the problem is here. Three rules:

  • Set -Xms equal to -Xmx. This eliminates wasted allocation.
  • Never set an -Xmx you could not support if fully consumed. The operating system needs its own capacity.
  • Over-allocating the heap can hurt. A very large heap lengthens GC phases and produces more noticeable freezes. "More is better" does not apply here.

In the G1GC configuration commonly used on Minecraft servers, values such as -XX:G1NewSizePercent=50, -XX:G1MaxNewSizePercent=80 and -XX:InitiatingHeapOccupancyPercent=10 are used up to 10 GB; above 10 GB these become 35, 60 and 15 respectively.

We covered how much RAM you need and how to pick a plan in our Minecraft server buying guide.

Auditing plugins

What matters is not plugin count but the load they generate. Thirty lightweight plugins can cause fewer problems than five badly written ones. How to audit:

  • Use spark profiling to see which plugin is eating tick time.
  • Do not just deactivate plugins you no longer use — delete them.
  • If two plugins do the same job, remove one (two land protection systems, two chat managers).
  • Watch for plugins running heavy queries or loading their own assets on every action.

For plugin installation, updating and the /reload trap, see how to add plugins to a Minecraft server. In short: never use /reload on a live server — it does not shut plugins down cleanly, producing memory leaks and scheduled-task conflicts whose symptoms surface hours later.

Player-caused lag

Some lag sources are not in a config file but inside your world:

  • Uncontrolled mob farms. One player's large farm can drag down the whole server's TPS.
  • Item piles on the ground. An auto-clear plugin and a sensible merge-radius largely solve this.
  • Permanently running redstone clocks. Builds nobody uses that never stop ticking.
  • Chunk loaders. Structures keeping areas loaded even with no player present.
  • Excessive hopper chains. Storage systems can accumulate hundreds of hoppers.

These problems need rules as well as technical fixes: farm size limits, recommending more efficient alternatives to hoppers, and regular world audits. Trying to solve it with settings alone does not hold up over time.

Hardware: the part settings cannot fix

A Minecraft server does most of its work on a single thread. So what determines TPS is not core count but the processor's clock speed and generation. A four-core server on a high-clocked current-generation processor can deliver higher TPS than an eight-core older one.

Storage matters more than it appears too: chunk loading, auto-save and the disk I/O that grows with world size all differ noticeably between NVMe M.2 SSD and SATA.

And there is a measurable trap: if your server runs on shared resources, your TPS is not under your control. Run top on Linux and read the %st (steal time) value on the CPU line — consistently above 10% during busy hours means the physical host is overloaded, and no setting fixes that. We covered the whole topic in our guide on the difference between VDS and VPS.

Six rules for optimising

  • Do not change anything without measuring. spark first, settings second.
  • Change one thing at a time and test under real load.
  • Do not paste config blocks from the internet. A value that fits someone else's server may not fit yours.
  • Avoid extreme values. A setting that makes gameplay feel wrong costs more than the TPS it buys.
  • Back up before every change.
  • Fix root causes. Paper cannot rescue a server drowning in entities and farms through settings alone.

Nubitro Minecraft servers

Nubitro Minecraft servers: high-clocked Ryzen 9 9950X, NVMe M.2 SSD, reserved resources and Istanbul location

Even with every setting above done right, hardware sets the ceiling on TPS. Nubitro Minecraft servers run on AMD Ryzen 9 9950X processors in Istanbul, Turkey, with NVMe M.2 SSD storage and 1 Gbps unmetered traffic.

Because resources are assigned through hardware partitioning, neighbour load does not reach your tick time — meaning the TPS you measure really is your server's performance. Plans scale from 2 cores / 4 GB RAM up to 6 CPU / 32 GB RAM.

Review the plans on our Minecraft server hosting page, or see Ryzen VDS to build your own configuration. For everything else, visit the Nubitro homepage.

Frequently Asked Questions

TPS is 20 but players say it lags. Why?

TPS measures the server side, not what players experience. If the server holds 20 TPS while players feel lag, the problem is the network: ping, packet loss or distance. If your player base is in Turkey, an overseas location alone adds 40–60 ms.

I added RAM and TPS did not improve. Is that normal?

Yes, very common. Adding RAM helps only if you were genuinely memory-starved. Drops at regular intervals point to GC settings; steady, flat low TPS points to single-core saturation. Neither is fixed with RAM.

How low should I set view-distance?

6–8 is a reasonable starting range on busy servers, with simulation distance kept below it. But measure at your current value first — on some servers the bottleneck is entity load rather than distance, and lowering it only degrades the experience.

A plugin looks wide in the spark report. Should I remove it?

Not immediately. A wide branch shows where sampled time was spent, not that the code is broken — the plugin may simply be doing the real work. Read the report alongside player activity at the time, and if possible disable the plugin on a test server and re-measure.

Can I use ready-made optimisation config packs?

Use them as a starting reference, but do not paste them wholesale. These packs are usually built for a specific server type and can contain aggressive values; the result is gaining TPS while ruining how the game feels. Apply each setting deliberately, one at a time.

Does world size affect TPS?

Not the file size directly — exploration into ungenerated terrain does. If players constantly open up new areas, chunk generation spikes MSPT. Setting a world border makes that load predictable.

Summary

  • The target is 20.0 TPS and MSPT under 50 ms; MSPT is the number to watch.
  • Start optimisation by measuring with spark, not by guessing.
  • Profile during the lag, not on an idle server.
  • A wide branch in a flame graph is not proof of guilt.
  • If ServerLevel#tickEntities exceeds 40%, the problem is mob, villager and hopper load.
  • Spikes during exploration point to chunk generation.
  • TPS drops at regular intervals are garbage collection pauses.
  • Paper now uses paper-global.yml, paper-world-defaults.yml and per-world paper-world.yml.
  • The highest return is in view/simulation distance, entity activation range and hopper settings.
  • -Xms and -Xmx should match; an oversized heap worsens GC freezes.
  • Judge plugins by the tick load they generate, not by count.
  • Never use /reload on a live server.
  • Single-thread performance sets the ceiling on TPS and settings cannot exceed it.
  • On shared resources, sustained %st above 10% means TPS is not under your control.
Powered by WISECP
💬
Top