GameGrid
Minecraft Server Performance & Optimization Guide - visual guide

Minecraft Server Performance & Optimization Guide

Reduce lag with view distance, simulation distance and - on Paper - config tuning, and understand what the platform already handles.

View Distance vs Simulation Distance

These are the two settings that matter most, and they are in the Settings tab under Performance on every server type.

view-distance (default 10, range 3-32) - how many chunks are sent to each player. It decides how far they can see. Those chunks are rendered but not necessarily ticking.

simulation-distance (default 10, range 3-32) - how many chunks around each player actually tick. Mobs spawn, crops grow, redstone runs and entities move only inside this radius.

Chunks between simulation-distance and view-distance are visible but frozen.

Lowering simulation-distance saves more CPU than lowering view-distance, because ticking is the expensive half.

server.properties is read when the server starts, so save these and then restart for them to take effect.

Recommended Settings

Standard server: view-distance 10, simulation-distance 8.

Roomier: view-distance 12, simulation-distance 8. More to look at without more to tick.

Struggling server: view-distance 6, simulation-distance 4.

The minimum either setting accepts is 3. Below about 6 for view-distance players start to notice terrain popping in.

A client cannot see further than the server sends. If a player has render distance at 32 and your view-distance is 8, they get 8.

Paper-Specific Optimizations

These apply to Paper only. Vanilla, Fabric, Forge and NeoForge have no bukkit.yml, spigot.yml or Paper config files, and creating them does nothing.

Paper's files are config/paper-global.yml and config/paper-world-defaults.yml, plus bukkit.yml and spigot.yml at the server root. Edit them from the Files tab with the server stopped.

In config/paper-world-defaults.yml: max-entity-collisions cuts collision maths where entities pile up; merge-radius for items reduces entity count by merging dropped items; redstone-implementation set to ALTERNATE_CURRENT is the biggest single redstone win.

In config/paper-global.yml: the chunk-loading-basic rates cap how fast chunks are loaded and sent per player, which smooths the burst when somebody joins or flies.

Paper config changes need a restart.

All of these files are included in your backups, so a change survives a restore.

What the Platform Already Does

The JVM heap is sized for you from the host, with a low floor and a generous ceiling between 2 GB and 12 GB, and the server is launched with G1GC. There is no RAM setting in the panel and no startup script to edit on Vanilla, Paper or Fabric.

That means "allocate more RAM" is not a step you can take here for those three. On Forge and NeoForge you can set your own -Xmx in user_jvm_args.txt from the Files tab, and it takes precedence over the platform's.

More heap is not automatically better anyway. A larger heap means longer collection pauses, and an OutOfMemoryError above 8 GB is usually a leak rather than a shortage.

The Resource Usage card on the Overview tab shows live CPU and memory for the server process. Watch it while the server is busy; that is the number worth quoting in a ticket.

Profiling with spark

spark is a free profiling plugin. It is a Bukkit plugin, so it runs on Paper only - four of the five server types here cannot load it.

/spark profiler start, leave it for a few minutes of normal play, then /spark profiler stop. It gives you a URL with a flamegraph showing where tick time went.

/spark heapsummary shows what is holding memory, which is the tool for a suspected leak.

/spark tps shows ticks per second. 20 is perfect; below 15 is lag your players can feel.

On Fabric, Forge and NeoForge there is a mod build of spark on the usual mod sites - install it through the Mods tab like any other mod. On Vanilla there is no profiler at all; use the Overview tab's resource graph and the Console.

Other Things That Help

Set a world border. It stops players generating endless new terrain, which is what quietly grows a world to tens of gigabytes. See Using the World Border Command.

Set an automatic restart on the Admin tab - 6, 12 or 24 hours. It only fires when nobody is connected, so it costs your players nothing.

max-players (Settings, default 20) is a real performance setting. Minecraft's game loop is single-threaded; extra cores help chunk loading and garbage collection, not the main loop.

pause-when-empty-seconds (Settings, default 0) stops ticking a world with nobody on it after that many seconds. Useful on a server that is quiet for long stretches.