Guide

How to Find What Is Lagging Your Minecraft Server with Spark (2026)

October 17, 2026 · 9 min read
Metrics dashboard with charts on a monitor
Metrics dashboard with charts on a monitor · Photo: Unsplash

Most lag guides list settings to change and hope one of them is the problem. Spark removes the guessing: it is the profiler bundled with Paper (and available for Fabric, Forge, NeoForge and Velocity), and in five minutes it tells you which plugin, mod, entity or chunk is eating the tick. Older guides still point at Timings; Paper deprecated it and Spark is what the Paper docs recommend today. This is how to use it and how to read what it says.

First, what kind of lag you have

Spark only helps with one of the three things people call lag. Ping is the distance between the player and the server: Spark cannot see it, and only the location can change it. FPS is the player's own PC. TPS, the server failing to finish 20 ticks per second, is what Spark measures. Symptoms of low TPS: mobs freezing, chests opening late, blocks reappearing, everyone slowed down at once. Run /spark tps: 20 is healthy, below 18 is noticeable, below 15 is clearly broken.

Also check MSPT (milliseconds per tick), which Spark shows next to TPS. A server can hold 20 TPS while spending 45 ms of its 50 ms budget on every tick; that is a server about to fall over when five more players join.

Running a profile

  1. On Paper, Spark is already there (spark.enabled: true in paper-global.yml). On Fabric, Forge or NeoForge, drop the Spark build for your loader into mods/.
  2. Reproduce the lag: profile while the server is busy, not at 3 am with nobody online. A profile of an idle server shows nothing useful.
  3. Run /spark profiler start --timeout 300 from the console or as an operator. Five minutes is a good window; the profiler itself costs almost nothing.
  4. When it ends, Spark prints a link to a web viewer. Open it; the rest of this guide is about reading that page.

Reading the profile

The viewer shows a tree of what the server thread spent its time on, sorted by percentage. You do not need to understand Java to read it; you need to find the first line that names something you installed.

  • Expand the top entry (the server tick) and keep expanding the biggest branch. Most of the time it leads to one of four places.
  • A plugin or mod name near the top with a large share: that is your culprit. Common offenders are web maps rendering live, anti-cheat with heavy checks, economy plugins writing to disk every tick, and mods with unbounded caches. Update it, change its config, or replace it.
  • Chunk generation or "worldgen": players exploring new terrain. This is the single most common cause on survival and modded servers, and the fix is to pregenerate the map with Chunky plus a world border.
  • Entities, hoppers or redstone ("entity tick", "tile entity tick", hopper classes): one player's mob farm, item sorter or clock. Spark's viewer can group by world and position; find it and talk to the owner, then cap entities per chunk in the Paper config.
  • Garbage collection pauses showing up as gaps: a memory problem, not a CPU one. Check the next section.

Checking memory with Spark

/spark healthreport shows TPS, MSPT, memory use and how much the garbage collector frees per cycle. /spark heapsummary lists which object types fill the heap. If a plugin or mod class is at the top, it is leaking or caching too much; if chunks and entities are, the world is the problem (view distance, loaded chunks, farms). A server that uses all its heap is normal; one that spends most of its time collecting garbage and barely frees anything needs either a leak fixed or more RAM, in that order. Also make sure the heap leaves 1-1.5 GB of headroom under the plan limit: our connection errors guide explains the silent out-of-memory kill.

What to change after the profile

Change one thing at a time and profile again. In order of how often each one actually fixes a server:

  1. Pregenerate the world and set a border. Removes live terrain generation entirely.
  2. Fix or replace the plugin or mod Spark named. Do not tune the whole server around one broken plugin.
  3. Lower view-distance to 6-8 and simulation-distance to 4-6 in server.properties. Players rarely notice; the server does.
  4. Cap entities and tune hoppers in spigot.yml and paper-world-defaults.yml (entity activation ranges, merge radius, hopper transfer ticks). Lowering activation ranges can break some iron farms; test it.
  5. Use Paper or Purpur instead of Spigot and start with Aikar's flags. Free performance.
  6. Only then consider more RAM, and only if the heap summary said memory was the problem.

Modded servers

Spark works the same on Fabric, Forge and NeoForge, and the culprits are usually mods with heavy world ticking (big tech mods, custom dimensions) or client-only mods that should not be on the server at all. Pregeneration matters even more on modded worlds, and performance mods for your loader (ModernFix, FerriteCore, Lithium on Fabric) remove a lot of overhead without changing gameplay.

If none of that is it

When Spark shows the server thread mostly idle, MSPT low, and the server still feels slow to everyone, the problem is below your server: an oversold CPU shared with too many other servers, or slow storage. No config fixes that; only the host can. That is the case where migrating solves it on the first day, and it is what our plans are built to avoid: dedicated CPUs with no usage caps, NVMe and nodes that are not oversold. Paste your Spark link into our Spark analyzer and it summarizes the report for you, whether or not you host with us.

Need a server that keeps up?

Ryzen nodes picked for per-core speed, DDoS protection, Java + Bedrock crossplay and 24/7 support that will set this up for you. Plans from $8/month.