Blog · blog

Best Performance Mods for Minecraft Servers

Server-side lag is a different problem from client FPS. Paper or Purpur, tuned JVM flags, pre-generated chunks, and sane view distance fix most of it.

TRtrolPublished 6 min read

Server lag is a different animal from client lag

Client-side guides talk about FPS: your own GPU drawing frames. Server performance is a completely separate measurement, ticks per second, how many times per second the server can run its full game loop. When TPS drops below 20, every player connected feels it as rubber-banding, delayed hits, and mobs that lag behind their actual position, no matter how strong any individual player's PC is. Fixing that lives entirely on the server's side of the connection.

This distinction matters because the two problems get mixed up constantly. A player with 300 FPS locally will still feel a server running at 12 TPS, and no client mod changes that. If you operate a server, especially a busy minigame lobby with BedWars or SkyWars arenas resetting constantly, the fixes below are where your time actually pays off.

Choose server software that is built for load

Vanilla Minecraft server software and an unoptimized Spigot setup run almost everything on a single thread. Paper, and forks like Purpur, rebuild large parts of that pipeline to run async and multithreaded, plus ship a long list of default optimizations vanilla never had. This is the single biggest lever available before you touch a single plugin or setting.

Paper

The standard modern choice. Async chunk loading, entity tracking optimizations, and a deep set of paper.yml tuning options most admins never fully explore.

Purpur

A Paper fork with extra performance knobs and gameplay toggles layered on top. Worth it if you want more control without leaving the Paper ecosystem.

Vanilla and stock Spigot

Functional, but leaves real performance on the table for anything beyond a small, low-population server.

Tune the JVM flags, not just the server config

Minecraft servers run inside a Java Virtual Machine, and the JVM's default garbage collection settings were never tuned for Minecraft's specific memory pattern. Aikar's flags are a widely used, publicly documented set of JVM startup flags that configure the garbage collector specifically for that pattern, and they meaningfully cut the frequency and length of GC-related freezes under real player load.

Pre-generate your world before players ever see it

One of the most common causes of a sudden TPS drop is the server generating new chunks in real time as players explore into unclaimed territory. That generation work competes directly with everything else the server is trying to do that same tick. A tool like Chunky pre-generates chunks ahead of time, in a controlled, throttled pass, so players exploring later never trigger that spike at all.

For a minigame network this matters less on the arena maps themselves, which are usually static and small, and more on any open hub or lobby world where players can wander.

Trim view distance and simulation distance

These two settings control how much world the server has to keep loaded and simulated around every player, and they are the setting operators most often leave at defaults that are simply too high for their player count and hardware.

SettingWhat it controlsCommon mistake
View distanceHow many chunks are sent to each clientLeft at a default too high for the player count
Simulation distanceHow far mobs, blocks, and redstone actually simulateSet equal to view distance when it does not need to be

Simulation distance is usually the one worth cutting first. Players do not need mobs and redstone simulating as far out as they need chunks rendered, and lowering it recovers real tick time with a much smaller impact on how the game feels.

Profile before you guess

Guessing at the cause of lag wastes time. A profiler like spark captures exactly where server tick time is going, whether it is a specific plugin, world generation, entity processing, or something else entirely, instead of you tweaking settings at random and hoping.

  1. Install Paper or Purpur

    Migrate off vanilla or stock Spigot first. This unlocks every optimization below.

  2. Apply Aikar's flags to your startup script

    Copy the documented flag set into your server's start command and restart. This is a one-time change with an ongoing payoff.

  3. Pre-generate your world with Chunky

    Run it during low-traffic hours so exploring players never trigger live chunk generation later.

  4. Set view distance and simulation distance deliberately

    Match them to your actual player count and hardware rather than leaving platform defaults in place.

  5. Profile with spark under real load

    Capture a report during peak hours and fix whatever it actually points to, instead of guessing.

Server-side performance is not the whole story

Getting TPS steady is half the experience. Every player still renders that steady server on their own machine, and a rock-solid server does nothing for someone whose own client is choking on rendering, memory, or an unmatched shader pack. If you operate a BedWars or SkyWars network and have already put in the work above, the other half of a smooth experience for your players is what happens on their end. That is exactly the gap Terminus is built to close, tuned client performance to match the server work you already did.

FAQ

Get Terminus

Tuned client performance to match the server work you already did.