Changelog · Plugin

VoxelBench 2.1.0

Folia regions seen from the game, and a benchmark world on Folia and Canvas VoxelBench 2.1.0 is mostly about Folia and its forks, such as Canvas. Folia ticks each region of the world on its own thread, so a single TPS said little: VoxelBench now measures every region and the…

Wby Wasab_II
October 7, 2026
0

Folia regions seen from the game, and a benchmark world on Folia and Canvas

VoxelBench 2.1.0 is mostly about Folia and its forks, such as Canvas. Folia ticks each region of the world on its own thread, so a single TPS said little: VoxelBench now measures every region and the global region from startup, lists them in game with /bench regions, says which region each TPS and MSPT figure describes, and its profiler tells you in which region the tick threads worked. Folia, which cannot create a world, gets a benchmark world of its own — a flat dimension the server loads itself, installed once with /bench world install — and Canvas gets a standing benchmark world created at startup.

It also fixes what a test campaign on real Paper, Folia and Canvas servers found. Reading the hardware information could get the server stopped by its watchdog, at the end of /bench start or on a plain /bench info. Tests timed in server ticks failed on a slow but live server instead of giving its figures. And on Minecraft 26.1, benchmark worlds were no longer found after a restart.

Scores stay comparable with 2.0.3 for runs in the same world: the tests run the same load and measure it the same way. On Canvas, and on Folia once the benchmark dimension is installed, a run without a pinned world now goes to a flat benchmark world, as on Paper and Spigot. Paper and Spigot have nothing to do; on Folia, install the benchmark dimension — see the Upgrade section.

Folia: every region, seen from the game

  • /bench regions [world] [page] shows a summary — worst and median region TPS, regions under 18 TPS, the global region, the utilisation of the region threads against their capacity, and the TPS of the region you stand in — then every region, worst first, with its world, centre, players, entities, chunks, TPS, average, 95th-percentile and worst tick time, and utilisation. /bench regions gui, or Regions (Folia) in the Monitor tab, shows the same on a screen.
  • /bench regions tp <id>, or a click on a region, takes you to its centre, only onto a safe spot: no liquid at your feet or head, and solid ground that is neither lava nor magma. Over an ocean, a lava lake or the End's void, it says so instead of teleporting you.
  • Every figure says what it describes. /bench tps and /bench mspt show your region (the global region from the console), VoxelBench's own measurement, which runs on the global region, and the worst and median regions. The boss bars, %voxelbench_tps%, %voxelbench_mspt%, /bench info and the web dashboard show the worst region, labelled as such. %voxelbench_tps_avg|min|max% and %voxelbench_mspt_avg|min|max% stay those of the tick monitor, which on Folia only sees the global region.
  • New placeholders: %voxelbench_region_tps% (the player's region, also with _5s, _15s, _1m, _5m or _15m), and region_count, region_lagging, region_tps_worst, region_tps_median, region_tps_avg, region_mspt_worst, region_global_tps, region_global_mspt, region_global_util, region_threads, region_util_total and region_util_capacity, each as %voxelbench_<name>%.
  • The web dashboard and /api/metrics get a Regions section: a summary and the table of regions.
  • Remote monitoring now sends, on Folia only, the global region's TPS, MSPT and utilisation, the number of region threads, the total utilisation, the median region TPS, the number of lagging regions and each region's utilisation, for the voxelbench.com dashboard. Paper and Spigot data is unchanged.
  • Entity and chunk counts come from Folia's own per-region counters: VoxelBench no longer reads every world's entities from the global region. The breakdown of entities by category or type shows N/A on Folia.

On Paper and Spigot, /bench regions says the server is not regionized and shows its TPS and MSPT.

The profiler on Folia: where, by region

The profiler is still experimental.

  • A profile says where the tick threads worked: the share of each region in the tick samples, with its world, its centre and the plugins that ran there, and the share outside any region tick (the global region, tasks between ticks). It appears in the chat summary, on the profile's screen, on the local web dashboard and in the profile file.
  • A lag on a single region is now caught. The automatic dump on lag also watches each region's own ticks, with the same thresholds (profiling.auto-dump.regions, on by default). On a scheduler with several threads, such a lag does not slow the global region, so it went unseen. The profile names the region whose ticks showed the lag; a lag made at least half of garbage-collection pauses is recorded as global. A region that merges, splits or unloads is never taken for a freeze.
  • What leaves your server. On Folia, a profile you upload to your account now carries the world names and block coordinates of its busiest regions, and the upload preview says so. A public share keeps the regions by number only, without their world or coordinates.
  • Region tracking costs one small event per region tick, and only while a capture or the ring buffer records.

Benchmark worlds on Folia, Canvas and Minecraft 26.1

Benchmarks build and clear test zones, so VoxelBench runs them in a world of its own when it can. Folia cannot create a world, and Canvas cannot safely remove one while running: until now, that meant pinning a world, or a run in the main world.

  • Folia: the benchmark dimension. /bench world install shows what it will do; /bench world install confirm writes a data pack adding a flat dimension, voxelbench:bench, which the server loads itself at the next start as <level-name>_voxelbench_bench (world_voxelbench_bench by default). Runs and tests then use it when no world is pinned. It needs Minecraft 26.1 or later. It also works on Paper and Canvas, where it is optional. The first start after installing pauses about 30 seconds, once, on Paper's "World storage migration is required" alert: that is expected. /bench world uninstall removes it, and its folder goes at the next start.
  • Canvas: a standing benchmark world. VoxelBench no longer creates temporary worlds on Canvas, which it could not remove. It creates voxelbench_bench at every start instead. benchmark.standing-world sets where: auto (the default) means Canvas only, true also Paper and Spigot, in place of temporary worlds, and false never.
  • Standing worlds come first, and are reset at startup. Without a pinned world, runs and /bench test use the standing world — the dimension first — before any temporary world. After a run has used it, its terrain is reset at the next start, before any world loads; its settings are kept. On Folia and Canvas, a multi-run no longer deletes region files between runs: their chunks could not be unloaded from there, so nothing was really reset. The standing world is reset at the next start instead.
  • No silent fallback on the main world. When no dedicated world is available, /bench start, stress-limit, tier, custom-profile and auto-bench runs now say so in chat, with the remedy for your server: /bench world install on Folia, benchmark.standing-world on Canvas, a pinned world or benchmark.auto-temp-world elsewhere. /bench test still refuses, with the same remedy.
  • Folia and Canvas are told apart, and the console says which at startup ([Worlds] Platform: …). On both, /bench world delete now deletes the world at the next start instead of failing, and on Canvas /bench world create creates the world on the global tick.
  • Minecraft 26.1: worlds found again. Since 26.1, Paper, Folia and Canvas store a world created by a plugin in world/dimensions/minecraft/<name>/, without a level.dat. VoxelBench 2.0.3 only looked for <name>/level.dat: worlds made with /bench world create were not loaded again after a restart, leftover temporary worlds were never deleted, and /bench world create did not see an old world of the same name. All three now look in both places, and leftover temporary worlds are deleted at startup.
  • Deletions are guarded. Every deletion of a world folder — temporary worlds at the end of a run on Paper included — checks that the real folder, links resolved, sits where such a world belongs, carries the expected name, and is neither the main world nor a vanilla dimension; it refuses when the main world's folder cannot be found. The server's own worlds are never deleted, whatever their name: with level-name=voxelbench_main, the Nether voxelbench_main_nether passed the voxelbench_ prefix. Every guard that protects the worlds VoxelBench did not create — region resets, entity sweeps, /bench zones clean, the rescue of players left in a benchmark world — also recognises the benchmark dimension.

Slow servers get their figures instead of a failure

Thirteen gameplay tests count their duration in server ticks: redstone, chunkTicking, mobPathfinding, boneMealGrowth, entityCramming, projectileStorm, liquidPhysics, combatSimulation, entityCollision, mobSpawn, playerWorldLoad, tickingTileEntity and villagerTrading. Their only guard was a wall-clock limit of their duration plus 60 to 120 seconds, which silently required a minimum TPS — about 7 for redstone with 1,600 pistons: 640 ticks in 90 s. A server holding 6.9 TPS got a failure ("hard ceiling … no progress at all") instead of its figures.

  • They now report their progress every 20 ticks, counted on the region of the test's zone, and a test that stops progressing is stopped after 120 s.
  • Their limit is the time their ticks take at 2 TPS, plus 60 s of setup: a 30-second redstone gets 380 s instead of 90 s.
  • What they measure is unchanged; on a slow server they take longer. Stress-limit tiers keep their limit.
  • multiCore, memory and disk report their steps too, and a limit message no longer says "no progress at all" about a test that does not report progress.
  • In auto-bench test jobs, a long test tells voxelbench.com it is progressing, at most once a minute, so the site no longer gives up on it after ten minutes of silence.

Hardware information no longer stops the server

Hardware information — disks and CPU voltage through WMI on Windows, network interfaces — was read on the server thread whenever a report was built, a unit test sent, /bench info typed or an information screen opened. That usually takes about a second. On a loaded Windows machine it took more than 60 s, and the watchdog stopped the server as crashed: at the end of a /bench start, before its report was written, or on a plain /bench info.

It is now read off the server thread, at startup and whenever /bench info or a screen asks for it, and reports use the last reading without waiting. A report is always written; the hardware shows as not measured (N/A) if it was never read, and a report sent before the first reading falls back on what Java sees, as before. /bench info waits at most 10 s for a fresh reading, without blocking the server. The Network screen's host names, interfaces and reachability probes are read off the server thread too.

No more invented numbers

  • A TPS or MSPT that nothing measured shows as N/A — and null in /api/metrics — instead of an invented 20.0 TPS or 50.0 ms: on Spigot without the tick monitor, and on Folia from outside a region.
  • A test too short to measure shows N/A instead of NaN, and its local report writes null instead of a bare NaN, which made the file invalid JSON. /bench reports and the report screen show N/A too, and a stress limit that held no tier no longer reads "TPS: 0.0".
  • The local report of a failed or skipped test now says "success": false, with its status, reason and error, and its real duration: every local test report said 0 seconds.

Smaller fixes

  • chunkTicking and blockPhysics no longer raise "Chunk system has shut down" after a /bench test in a temporary world.
  • combatSimulation: a mob standing exactly on its target no longer stops the combat pass with "x not finite".
  • Minecraft 26.1: no more "Unknown dimension 'minecraft:world_nether'" in the console at each /bench start.
  • Folia 26.1: a test run with a player no longer logs an exception from a global task. The server refuses custom scoreboards, so the test's sidebar is simply not shown there.
  • Remote monitoring: during a test, the regular collection no longer adds a second, partial point in the same second as a full one.
  • Folia: stopping the server with a player online and remote monitoring on no longer logs IllegalPluginAccessException.
  • /bench info showed the player slots as the loaded chunks, and the other way round.

Upgrade

Drop the new jar in plugins/ and restart. No config or data migration: two settings are added to your config.yml, benchmark.standing-world (auto) and profiling.auto-dump.regions (true), and nothing you set is overwritten. Three permission nodes are new, operators by default: voxelbench.regions for /bench regions; voxelbench.regions.tp to teleport, needed on top of voxelbench.regions and not its child; and voxelbench.world.install for /bench world install and uninstall, needed on top of voxelbench.world.

  • Paper and Spigot: nothing to do; runs keep using temporary worlds. On Minecraft 26.1, worlds you pinned or made with /bench world create load again after a restart, and leftover temporary worlds are deleted at startup. The benchmark dimension is optional, and benchmark.standing-world: true uses a standing world instead of temporary worlds.
  • Folia, Minecraft 26.1 and later: run /bench world install, then /bench world install confirm, and restart. Until then, a run without a pinned world uses the main world and says so, and a gameplay test that writes to the world is refused, whether started with /bench test or by an auto-bench test job.
  • Folia before 26.1: the benchmark dimension is not available there. Pin a world the server loads at startup with /bench world set, as before.
  • Canvas: nothing to do. voxelbench_bench is created at the next start and used when no world is pinned; set benchmark.standing-world: false if you do not want it.
  • Slow servers: on a server that falls below about 7 TPS under load, the tick-timed tests now finish instead of failing, and take longer — up to 380 s for a 30-second redstone.
  • Profiles on Folia: an uploaded profile now carries the world names and coordinates of its busiest regions; a shared one does not.
  • Tools reading /api/metrics: an unmeasured TPS or MSPT is now null, and on Folia a regions section is added.

Compatibility

Java 16 or newer for Minecraft 1.17 to 1.21.x; Java 25 for Minecraft 26.1 and later — unchanged. Built against the Spigot API from 1.17.1 to 26.2.

Tested by hand on Paper, Folia and Canvas 26.1.2 (side by side with 2.0.3), on Paper and Folia 1.21.11, and on Paper 1.17.1. A two-run /bench start was also run on Paper 26.1.2, in a temporary world, and on Folia 26.1.2, in the benchmark dimension. Spigot 26.1.2 was tested by hand with a full /bench start. Minecraft 26.2 was not tested by hand for this release.

How did you find this article?
Sign in to react