Installation
- 1Drop the jar into plugins/ and restart. There are no dependencies. Paper fetches sqlite-jdbc itself on first boot for the spike history; if that download cannot happen, LagScout says so and keeps running without it.
- 2Run /lagscout. That is the whole setup — it is already measuring. Read MSPT before TPS: TPS is a rolling average that moves slowly, while MSPT is how long ticks are actually taking, and a server can sit at 19.9 TPS with every tick taking 48ms.
- 3Give your admins lagscout.admin. Optionally edit plugins/LagScout/config.yml and run /lagscout reload.
Why this exists next to Spark
Spark is excellent, free, and you should have it. It samples the JVM and tells you which code is slow. That answers a different question from the one most server owners have.
When a profiler says ServerLevel.tickBlockEntities is eating 40% of your tick, it is telling the truth and there is nothing you can do with it. The question you actually had was what in my world is doing this, and where.
LagScout counts real events — redstone updates, hopper transfers, mob spawns, chunk loads — per chunk, ranks them, and hands you coordinates. The two tools answer adjacent halves of the same question and neither replaces the other.
Reading a scan
Green lines are measured. "measured 4881.0 redstone updates per second" means your server fired 4,881 redstone updates in that chunk, in a second. It is a count, not an estimate.
Grey lines are loaded. Those are things sitting there, scored with configurable weights. Presence is only a proxy for cost, and the colour is the only thing telling you which kind of number you are reading.
The score sorts the list and nothing more. If a chunk looks wrong at the top, read its counts rather than trusting its number — and if the weights are wrong for your server, changing them reorders the list without changing a single piece of evidence.
The spike record
When TPS drops below alerts.tps-below or MSPT rises above alerts.mspt-above for alerts.sustained-seconds in a row, LagScout captures the ranked chunks as they were at that instant and announces it to everyone holding lagscout.alerts.
Sustained, not instantaneous, on purpose: a single bad second is a world save or a chunk generating, and alerting on those teaches you to ignore alerts — which costs more than the alerts were ever worth. The cooldown exists for the same reason.
The description of each chunk is written at capture time and frozen with the numbers. Reading a month-old spike and describing it from today’s weights would quietly rewrite history.
Run /lagscout snapshot once after installing. It records an entry exactly as a real spike would, so you know the path works before the night you need it.
Tuning the overhead
Raise meters.physics-sample-rate first. Block physics is by a wide margin the highest-volume event in Minecraft — a single piston door fires hundreds per tick — so one in every N is counted and credited with the whole batch. 32 cuts most of the remaining cost and keeps the signal; 1 turns sampling off for anyone who wants exact numbers and has the headroom.
Switching a meter off is a real saving rather than a cosmetic one: a disabled meter is not registered with Bukkit at all, so it costs no event dispatch. But understand the trade — with hopper set to false, a hopper chain melting your TPS will not appear anywhere in a scan. Prefer sampling to switching off.
Meter changes need a server restart, because handlers are registered once at startup. /lagscout reload says so rather than pretending it applied them.
Cleanup, and what is never removed
Automatic cleanup ships off. Preview first: /lagscout preview counts what a sweep would take and removes nothing, using the same code path the sweep uses — a preview written as a second, simpler implementation would eventually disagree with the sweep, and the disagreement would only be discovered after something irreplaceable had gone.
The caps are the point. Only what is above a per-chunk cap is removed, so an ordinary chunk with a few dropped blocks in it is never touched.
Whatever the config says, LagScout never removes: anything with a custom name, tamed or leashed animals, anything carrying a passenger or riding something, anything the server has marked as not despawning, armour stands, item frames, paintings, display entities, boats, minecarts, or items that are named, enchanted or on the protected list. Those are not configurable, because every one of them exists as a rule somewhere a plugin made it optional and somebody turned it on.
Which command names reach LagScout
/lagscout is not a name anything else usually wants, but /lag frequently is — ClearLag and several others take it. Bukkit is first-come-first-served and does not tell you when a name is lost.
LagScout never takes a name from another plugin. If something else owns /lag, it keeps it, and /lagscout still works.
/lagscout commands answers what is actually true on your server. Trust that over any documentation, including this page.
Commands
| Command | What it does | Permission |
|---|---|---|
/lagscout | Server health, what is being measured, and what LagScout itself costs. | lagscout.use |
/lagscout scan [world] [count] | Rank the worst chunks right now, with the evidence and a teleport. | lagscout.use |
/lagscout chunk | Everything known about the chunk you are standing in. | lagscout.use |
/lagscout who (player) [radius] | What the area around a player is costing. Proximity, never ownership. | lagscout.use |
/lagscout history [count|#id] | Spikes recorded while nobody was watching, and the chunks behind each one. | lagscout.use |
/lagscout preview · /lagscout clean [items|mobs|all] [world] | What a sweep would remove, and then actually removing it. Same code path. | lagscout.use · lagscout.clean |
/lagscout report [count] | A plain-text report in the plugin folder, for pasting into a support thread. | lagscout.use |
/lagscout watch | Live TPS and MSPT on your action bar while you walk around looking. | lagscout.use |
/lagscout snapshot | Record a spike entry right now, exactly as a real one would be recorded. | lagscout.use |
Still stuck?
Post in Discord with your server version and the relevant part of the log. That is almost always enough to get a straight answer the same day.
Get help