Low TPS? How to Improve Server Performance

Twenty TPS is the goal. Anything below that is noticeable: blocks that break with a delay, mobs that stutter, redstone that stops working reliably. Below are the steps with the most impact, in order. Measure before and after each change with /spark tps.

Step 1: measure first, do not guess

Open the console and type /spark profiler start. Play normally for five minutes. Type /spark profiler stop. Spark generates a link to an overview that shows exactly where the tick time goes. Without this measurement you are changing settings in the dark.

The three most common culprits: chunk generation (players exploring new terrain), entities (mobs, items, armor stands) and poorly written plugins.

Step 2: pre-generate chunks

Chunk generation is the heaviest thing a Minecraft server does. Every time a player enters new terrain, the server has to calculate it. With the plugin Chunky, you generate the map in advance:

/chunky radius 5000
/chunky start

This generates a circle of 5,000 blocks around spawn. Do this at a quiet time; it takes a while but prevents lag during play. Then set a world border so players cannot go beyond the generated area.

Step 3: lower view and simulation distance

Open server.properties:

  • view-distance=7 (default 10; for survival, 6 to 8 is fine)
  • simulation-distance=4 (default 10; this controls how far mobs and redstone are active)

The difference is significant: view-distance 10 loads four times as many chunks as view-distance 5. Simulation distance 4 instead of 10 means entities beyond four chunks no longer cost tick time.

Step 4: set entity limits

In bukkit.yml under spawn-limits:

  • monsters: 50 (default 70)
  • animals: 10 (default 10)
  • water-animals: 3 (default 5)
  • ambient: 1 (default 15; bats cost TPS and do nothing)

In paper-world-defaults.yml you find despawn-ranges and entity-per-chunk-save-limit. Lower the save limit for item frames and armor stands if your server has many of those.

Step 5: Aikar's JVM flags

The default JVM settings are not optimal for Minecraft. Aikar's flags tune the garbage collector so the server pauses less for memory cleanup. In the game panel, add these to the startup settings. For servers up to 12 GB:

-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1

Step 6: audit your plugins

Spark shows per plugin how much tick time it uses. A plugin above 5 ms per tick is suspicious. Remove or replace plugins that use a disproportionate amount of time. Common offenders: ClearLag (ironically), old hologram plugins and poorly written minigame plugins.

Want to start measuring? /spark tps works on every Paper server at HostValues. See the Minecraft plans.

Does more RAM help with low TPS?

Only if the server is actively running out of memory (OutOfMemory in the logs). Usually TPS is a CPU problem, not a memory problem. 4 GB of RAM with good settings performs better than 8 GB with default settings.

What is the difference between TPS and MSPT?

TPS is the number of ticks per second (target: 20). MSPT is the time in milliseconds per tick (target: under 50). When MSPT exceeds 50, the server can no longer maintain 20 ticks per second and TPS drops. Spark shows both.

Do I need Paper for good TPS?

Not required, but strongly recommended. Paper has dozens of built-in optimizations that Vanilla and Spigot lack. The difference on the same hardware is measurable: 5 to 30 percent lower MSPT, depending on the server.


Still stuck? Open a support ticket and our team will help you out.

Back to the blog