Sueta

VoxelBench - Server Benchmark & Performance Testing

2.6.4

Measure and compare your server's real performance with 20+ standardized tests, stress limit mode, a

·Plugin
  1. 2.6.4latestRun conditions in every report, steadier Single-Core score, smarter memory checks, MC 26.32 days ago
    What's new The first update announced since 2.3.0: it includes everything 2.4.0, 2.5.0, 2.5.1, 2.6.0, 2.6.1, 2.6.2 and 2.6.3 changed. Reports now say in what conditions they ran, down to each test. voxelbench.com's Single-Core score is computed from the main thread's own time, measurements that vary by 1 to 9 % from one run to the next where the old score varied by 7 to 23 %. The calibration probe waits for the server to calm down, even after chunk generation, measures for a second and is judged against the host's own noise. The memory checks no longer cost a report its score over garbage, and finished runs no longer pile up in memory. Folia reports the ticks of each test's region, and Minecraft 26.3 is supported. Scoring changes in two places: the Single-Core sub-score and the stability multiplier of the total. Run conditions — what the host was doing during your run The same server can score 55k one day and 89k the next; a 2.3.0 report could not say why. Full benchmark and stress limit reports (multi-run and auto-bench included) now carry the facts, and voxelbench.com flags a run it cannot trust and compares only runs made in the same configuration. · Isolation — CPU quota, allowed cores, memory limit, host CPUs and memory, filesystem of the server folder (network storage flagged). "No limit" is stated positively, and a host's memory is no longer sent as a container's (one report had shown a 511 GB "container peak") · Contention, per run and per test — stolen CPU time, time and quota periods throttled, CPU/disk/memory pressure, machine load, CPU quota re-read during each test, container memory, swap, memory-limit events, OOM kills, the server's resident memory · Why a tick was slow — on Paper and Spigot, each test counts its slow ticks (≥ 2× its median and ≥ 50 ms) and how many a GC pause, the CPU quota or stolen time explain · Server state at the start — Java uptime, bench runs since, worlds, chunks, entities and other players outside the benchmark world; for most tests, the heap right after the pre-test collection · A machine that changed — a salted fingerprint of the machine's boot says whether it rebooted or the server moved; the boot id and the salt never leave the server · Disk cache check — says whether the cache bypass really happened, and why it has no result when it has none Mostly read between tests, off the main thread; throttling and steal come from a background thread reading two Linux counters every 40 ms during each test (about 0.3 % of one core on a one-core container, reported in every Linux report). On Windows and macOS only the calibration remains. One console line sums up each run, for example Run conditions: steal 1.8 %, throttled 4.3 s, CPU pressure 22.0 %, calibration drift 3.1 %; logging.test-verbosity: DEBUG prints every figure. Single-Core score — measured on the main thread's own time The redstone circuit repeats every eight ticks, and TPS/MSPT sampled every 200 ms kept falling on the same phases: on one machine at 20 TPS in every run, the old Single-Core score ranged from 63,000 to 116,000. Since 2.6.1 the plugin measures the main thread's CPU time, and voxelbench.com's Standard scoring reads it since 8.2.0. · Redstone: CPU time per 8-tick cycle (2–5 % from run to run) · block physics: CPU time per tick (1–3 %) · single-core test: operations per second of CPU time (5–9 %) — against 7–23 % for the old Single-Core score · The single-core test now counts, with a quarter of the weight; the Scores Dashboard and Last Results screens of /bench gui list it under Single-Core · A new scale: Single-Core, synergy and total scores do not compare with older reports; Hardware and Gameplay do. Reports before 2.6.1, and from Folia, keep the previous scoring · Standard scoring 8.3.0 also leaves the redstone out of the total's stability multiplier (its sampled TPS said nothing about the server) and turns the multiplier's steps into a continuous curve; on 31 real runs, totals moved by −0.3 to +8.7 %, and 8.2.0 reports are recalculated automatically · The report shows the redstone's effective TPS, the rate the circuit really ran at (7 to 14 on servers whose sampled TPS read 17 to 20); no score reads it · The single-core test also reports how much of its slices the main thread really ran (not on Windows), its throughput second by second, GC during the test and the current CPU frequency (Linux); redstone slow ticks are counted against the heaviest tick of a cycle, so the circuit's own work no longer counts as spikes Calibration probe — waits, measures for a second, judged against the host's noise A small computation timed at the start, middle and end of a run and before every test shows when the machine slows down; voxelbench.com judges stability test by test, so a run slowed during a few tests still counts for the scores they do not feed. · Waits for the server's own threads to calm down (two half-second windows under a quarter of the CPU quota, 8 s at most) and says when the quota held a sample back. One-core container: the point after chunk loading went from a median of 87 ms to 16–21 ms · Waits up to 30 s after chunk loading, while the server saves the chunks it generated and collects what that leaves (about 20 s of CPU time in our tests): on two cores shared with a neighbour, the point measured a calm server after 14 s, where an 8 s wait had measured a busy one · voxelbench.com no longer judges a point measured while the server was still busy: the tests on either side are judged on their other point. The report shows how long the server took to calm down after chunk loading, about 2 s on a calm host and 14 s on shared cores in our tests · Measures 40 runs instead of 5 (about a second per point), with the point's own spread · voxelbench.com judges each point on its median against the host's own noise. On one shared host whose 60-second tests varied by less than 2 %, three 2.6.1 runs were left out of every comparison over best times moving from 22.6 to 31.6 ms; a merely noisy host is no longer read as disturbed, a real slowdown still is · Cost, between tests only: the calibration takes 16–18 s of a standard benchmark (about 2 s in 2.6.1); the wait for calm adds 3–5 s under 2 cores, about 3 s without limits, 14–16 s under 1 core; after chunk loading, a still-busy server can add up to 22 s (6.4 s on shared cores in our test, nothing with two cores of its own) Memory checks — no more tests lost to garbage A report missing a required test gets no score, and a heap full of uncollected garbage (serial collector, -XX:+DisableExplicitGC) could cost one. · Before a test: a projected heap ≥ 85 % no longer skips the test on the spot; VoxelBench waits up to 30 s for a new collection to make room (4–5 s in our tests, outside the measurement). One Paper server with a 6 GB heap had lost two gameplay tests in three runs out of five · During a test: the watchdog (heap ≥ 92 % for 3 s) runs one full collection first and stops the test only if the heap, or its old generation, is still that full. A production server (-Xmx6G -Xmn600m, explicit GC disabled) had lost lightingUpdate at 92.8 %; with its memory settings and the threshold lowered to 75 %, 2.6.1 stopped the test at 75.2 %, 2.6.2 found 11.4 % after the collection and the test completed · When explicit GC is disabled, both checks use Java's diagnostic command (the one jcmd <pid> GC.run uses) and the report says so · A really full heap is still stopped, one collection later; a collection inside a test is recorded, and voxelbench.com treats that test as disturbed while the report keeps its score · A finished run no longer stays in memory: since 1.0.0 the single-core test's timer kept every finished run alive (about 57 MB per run until a restart); five runs in a row on a 3 GB heap now end at 296 MB of live heap instead of 511 MB, and later runs of a se
    4 downloads
  2. 2.3.0bench jvm — your Java command line, checkedlast week
    What's new VoxelBench now checks your Java command line against your Java version and memory, warns at startup when the heap can fill the container, and masks the private parts of that line in your reports. Auto-bench runs started from voxelbench.com no longer fail when the bot's connection drops mid-run. /bench jvm — your Java command line, checked A line copied from an old guide can carry options that are obsolete, belong to another garbage collector, or stop the JVM from starting. /bench jvm asks voxelbench.com's optimiser, which knows them for your Java version. · Removed, obsolete and deprecated options, experimental options without their unlock flag, conflicting collectors, options for a collector you do not use · How much heap fits: in a container, metaspace, compiled code and thread stacks need room too · A corrected command line — your line with those corrections only. Click it in game to copy it; also written to plugins/VoxelBench/jvm-flags.txt · Options worth testing (Aikar's G1 settings, generational ZGC from Java 21), never applied for you: benchmark before and after · Only the -X/-XX options leave, without paths; -D properties and agents stay on your machine, where the line is assembled · Permission voxelbench.jvm (operators by default) Example: -Xmx8192M in an 8,203 MiB container leaves 11 MiB for everything else; the corrected line uses -Xmx6972M. Startup warning — heap that can fill the container When less than 512 MiB (or 5 % of the limit) is left outside the heap, the server can be killed for lack of memory without a word in its console. VoxelBench says so once at startup and points to /bench jvm. Java flags in reports are masked A command line often holds secrets (a license key in a -D property, a password, an agent path) and a report can be public. -D values (except harmless ones such as file.encoding), agent paths and the file paths of some options are now replaced with <redacted>, at every anonymization level. voxelbench.com masks older reports the same way. Reports also carry the Java distribution (vendor, VM name). Auto-bench — runs survive a lost connection On some hosts, a long freeze is followed by the bot's connection being closed by the host's network, and the job failed while the run went on alone. · The run keeps what it says to the bot while the bot is away · The bot comes back with a single-use token from voxelbench.com (five per job), receives everything it missed, in order, and the run goes on · Before a test that needs a player, VoxelBench waits up to 5 minutes for such a bot instead of 30 seconds · The bot's name is not enough: on an offline-mode server, someone logging in under it without the token gets nothing from the run and never spectator mode Smaller fixes The auto-bench bot was saved in spectator mode after its run, so whoever logged in next under its name was a spectator; it now gets its game mode back when it leaves. Upgrade Drop the new jar in plugins/, restart. No config or data migration. New permission voxelbench.jvm (operators by default); /bench jvm writes plugins/VoxelBench/jvm-flags.txt. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 25 required for MC 26.1 and later. Unchanged from 2.2.0; tested on Paper and Folia 26.1.2.
    23 downloads
  3. 2.2.0Disk test on slow storagelast week
    What's new The disk test no longer ends with no measurement on slow or shared storage, and long tests say where they are — in the console, on your voxelbench.com auto-bench dashboard, and in the report of a test that did not finish. If the disk test of your /bench start failed with "hard ceiling", this release is for you. Disk test on slow storage Up to 2.1.0 the disk test ran a fixed amount of work (3 passes, 500,000 random 4K writes and reads per phase). On shared storage at about 2 ms per write, one phase alone needed some 17 minutes: the test hit its 15-minute limit and threw away everything it had measured. · Each phase now stops after 40 s (sequential) or 60 s (random) and gives the rate of what it did in that time. The phases of three passes add up to 10 minutes at most · On storage that keeps up, nothing changes: phases finish long before their limit · The report says when a phase reached its limit (timeCappedPhases), and voxelbench.com shows it · The test really stops at its time limit and on /bench stop — it used to keep writing during the following tests — and deletes its file · It checks the free space first (file + 256 MiB), and is skipped instead of filling the disk Long tests say where they are disk (4 stages per pass), memory (7 per pass) and multiCore (its tasks) report their stages, following logging.test-verbosity: · NORMAL (default) — progress every 30 s and the result of any stage lasting 30 s or more. On a fast server, nothing more than before · VERBOSE — every stage, a status line every 10 s; for the disk, bytes really read and written and the I/O pressure · DEBUG — the storage as the server sees it (mount, device, I/O limits), its latency on a few operations, and the test threads' stacks when a stage stops progressing or a test reaches its limit A test that does not finish names the stage it stopped in and how far it got, in the console and in its report ("Stopped during" on voxelbench.com). Auto-bench The voxelbench.com dashboard shows the stage of a long test while it runs. Standard runs report the progress of their tests too (at most one line a minute) — the dashboard used to stay on "test 1/12: disk" for as long as the disk test lasted. Smaller fixes The VERBOSE test detail printed an internal class name instead of each value · two disk test console messages were in French. Upgrade Drop the new jar in plugins/, restart. No config or data migration, no new setting. The config.yml comment of logging.test-verbosity is updated for new installs only. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 25 required for MC 26.1 and later. Unchanged from 2.1.0; tested on Paper and Folia 26.1.2.
    13 downloads
  4. 2.1.0Folia - every region, seen from the game2 weeks ago
    What's new Folia regions — every region, seen from the game On Folia and its forks such as Canvas, each region ticks on its own thread, so a single TPS said little. VoxelBench now measures every region and the global region from startup, and every view says which region its TPS and MSPT describe. · /bench regions [world] [page] — worst and median region TPS, regions under 18 TPS, the global region, region-thread utilisation against capacity and your own region's TPS; then every region, worst first: world, centre, players, entities, chunks, TPS, avg / p95 / worst tick time, utilisation · /bench regions tp <id>, or a click — teleports to a region's centre, only onto a safe spot (no liquid at feet or head, no lava or magma underfoot) · /bench regions gui, or Regions (Folia) in the Monitor tab — the same on a screen · /bench tps and /bench mspt say whose figures they show (your region, or the global region from the console) and add the worst and median regions · Boss bars, %voxelbench_tps%, %voxelbench_mspt%, /bench info and the web dashboard show the worst region, labelled as such · New placeholders: %voxelbench_region_tps% (player's region, optional _5s … _15m), plus 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; remote monitoring sends the global region, the scheduler load, lagging regions and each region's utilisation to your voxelbench.com dashboard · Entity and chunk counts come from Folia's own per-region counters; the breakdown by entity type shows N/A there · On Paper and Spigot, /bench regions says the server is not regionized and shows its TPS and MSPT Benchmark worlds — Folia, Canvas and Minecraft 26.1 Folia cannot create a world and Canvas cannot safely remove one, so runs there needed a pinned world or went to the main world. Both now get a benchmark world of their own, and on Minecraft 26.1 benchmark worlds are found again after a restart. · Folia: the benchmark dimension. /bench world install previews, /bench world install confirm writes a data pack adding the flat dimension voxelbench:bench, which the server loads at its next start (world_voxelbench_bench by default). MC 26.1+, also works on Paper and Canvas; /bench world uninstall removes it · The first start after installing pauses about 30 s, once, on Paper's storage migration alert — that is expected · Canvas: a standing world. voxelbench_bench is created at every start, instead of temporary worlds Canvas could not remove (benchmark.standing-world: auto = Canvas only, true = also Paper and Spigot, false = never) · Standing worlds come first when no world is pinned, and their terrain is reset at the next start after a run used them. On Folia and Canvas, multi-runs no longer delete region files between runs · No more silent fallback on the main world: runs say so in chat, with the remedy for your platform; /bench test still refuses · Folia and Canvas are told apart; on both, /bench world delete deletes at the next start instead of failing · MC 26.1: worlds made with /bench world create load again after a restart, leftover temporary worlds are deleted, and create sees an old folder of the same name · Every world deletion is guarded (real path, expected name, never the main world or a vanilla dimension); the server's own worlds are never deleted, even with level-name=voxelbench_main Profiler on Folia — where, by region A profile now says in which region the tick threads worked, and a lag on a single region, which the global region never saw, is caught. The profiler is still experimental. · Each region's share of the tick samples, with its world, centre and the plugins that ran there, plus the share outside any region tick — in chat, on the profile screen, on the web dashboard and in the file · The automatic dump on lag also watches each region's own ticks (profiling.auto-dump.regions, on by default) and names the region; a lag made at least half of GC pauses is recorded as global · A profile you upload to your account now carries the world names and coordinates of its busiest regions, and the preview says so; a public share keeps regions by number only Hardware readout — no more watchdog stop Disks, CPU voltage (WMI on Windows) and network interfaces were read on the server thread when a report was built or /bench info typed. On a loaded Windows machine that took over 60 s, and the watchdog stopped the server — at the end of /bench start, before its report was written. It is now read off the server thread: reports never wait for it, and /bench info waits at most 10 s without blocking anything. Slow servers — figures instead of a failure Thirteen gameplay tests timed in server ticks ( redstone, chunkTicking, mobPathfinding, mobSpawn, tickingTileEntity…) had a wall-clock limit that silently required about 7 TPS: a server at 6.9 TPS got "hard ceiling … no progress at all" instead of its figures. They now finish, and take longer. · Progress is counted every 20 ticks, on the region of the test's zone; a test that stops progressing is stopped after 120 s · The limit is the time their ticks take at 2 TPS plus 60 s of setup — a 30 s redstone gets 380 s instead of 90 s · What they measure is unchanged; stress-limit tiers keep their limit · Auto-bench test jobs report progress at most once a minute, so voxelbench.com no longer gives up on a long test Smaller fixes A TPS or MSPT nothing measured shows N/A ( null in /api/metrics) instead of an invented 20.0 / 50.0 · a test too short to measure shows N/A instead of NaN, and local reports stay valid JSON · a failed test's local report says "success": false, with its real duration · chunkTicking and blockPhysics no longer raise "Chunk system has shut down" after a test in a temporary world · combatSimulation no longer stops on "x not finite" · MC 26.1: no more "Unknown dimension 'minecraft:world_nether'" at each /bench start · Folia 26.1: no more console exception at each test run with a player (the test sidebar is not shown there) · remote monitoring no longer sends a second, partial point in the same second during a test · Folia: no more console error when the server stops with a player online and remote monitoring on · /bench info no longer swaps player slots and loaded chunks. Coming soon · Extension API (preview) — other plugins will be able to register their own benchmark tests in VoxelBench. It is functionally complete but not yet announced for public use; the announcement is planned for a future minor release Upgrade Drop the new jar in plugins/, restart. No config or data migration: benchmark.standing-world and profiling.auto-dump.regions are added to your config.yml. New permissions, ops by default: voxelbench.regions, voxelbench.regions.tp (on top of it, not its child) and voxelbench.world.install (on top of voxelbench.world). Scores stay comparable with 2.0.3 for runs in the same world. Tools reading /api/metrics now get null for a TPS or MSPT nothing measured. Paper, Spigot: nothing to do; runs keep using temporary worlds, and the benchmark dimension is optional. Folia 26.1+: /bench world install, then /bench world install confirm, and restart. Until then, runs use the main world and say so, and world-writing tests are refused. Folia before 26.1: no dimension; pin a world loaded at startup with /bench world set, as before. Canvas: nothing to do; voxelbench_bench appears at the next start ( benchmark.standing-world: false to opt out). Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 25 required for MC 26.1 and later. Buil
    21 downloads
  5. 2.0.3Benchmarks no longer remove anything outside their own worlds3 weeks ago
    What's new VoxelBench no longer removes anything outside its own worlds. Up to 2.0.2, several cleanups could delete what players had built or tamed in your worlds — if you run 2.0.2 or earlier, read the next section before your next benchmark. Also: three tests measured in the right regions on Folia, custom profiles counted on the zones they really use, and a batch of smaller fixes. Data safety — if you run 2.0.2 or earlier Several cleanups removed things VoxelBench had not placed, in worlds that were not its own. · Multi-run could delete regions of your main world. /bench start <runs> with more than one run, or with warmup, and no pinned world — the default setup — prepared its zones in the main world while the tests ran in a temporary one, then between runs unloaded those chunks without saving and deleted the region, entity and POI files around each zone (1,000 to 10,000 blocks from spawn). Pinning the main world did the same. Auto-bench jobs with several runs too, whenever they fell back on the main world (no temporary world could be created, as on Folia, or the main world was pinned) · Every run removed entities from every loaded world, on Paper and Spigot. At the start of each /bench start, custom profile, tier and stress-limit run, auto-bench included: villagers, farm animals, wolves, cats, horses — tamed or named ones included —, hostile mobs, dropped items, minecarts and boats. Folia skipped this sweep · /bench zones clean and /bench stop could sweep entities around fixed test coordinates (x = 50,000 to 70,000) of the main world Update before your next multi-run. Until you can, pin a voxelbench_* world first — /bench world create bench, then /bench world set voxelbench_bench — so that pre-warm, region resets and those sweeps target it. Pinning does not stop the start-of-run sweep on Paper and Spigot: only the update does. On Folia, where a world cannot be created while the server runs, avoid multi-runs until you update. Nothing removed outside voxelbench_* worlds Outside its temporary benchmark worlds and those made with /bench world create, VoxelBench no longer removes anything it did not place itself. · Multi-run takes its world before pre-warming: pre-warm, shared zones and region resets all target the world the tests run in. Regions are reset, and chunks force-loaded, only in a voxelbench_* world — elsewhere that step is skipped with a message and the run goes on. Auto-bench follows the same rule · The start-of-run sweep only touches voxelbench_* worlds; weather and time are still set everywhere, then restored · /bench zones shows the last run's zones in that run's world; clean refuses any other world · /bench stop, shutdown and crash recovery sweep only voxelbench_* worlds, with no fallback on the main world Tests still remove what they built themselves. A multi-run in another world (main world pinned, or Folia without a pinned voxelbench_* world) no longer resets regions between runs and says so. Folia — three tests measured where they work lightingUpdate and tickingTileEntity build at their own coordinates, but their TPS and MSPT were read on the run's shared zones, where they build nothing — standard benchmark included. playerWorldLoad was read at the world centre only. Those regions sat at about 20 TPS whatever the load. · All three are now measured in the regions they build in · Their Folia results may come out lower than in 2.0.2: they now reflect the real load. lightingUpdate and tickingTileEntity count in the site's Gameplay score, so a standard Folia score can move · Paper and Spigot are unchanged Custom profiles — loads counted on the zones actually used A profile step with dispersedZones above 1 always runs on the run's 8 zones, but four tests counted on the step's value (2 to 7). · Hoppers filled only 2 of 8 zones in free-host, 4 of 8 in low-memory and example (Paper, Spigot); a value of 9 or 10 made the test fail · TNT: free-host placed 160 charges for 40 "requested", which skewed the detonation ratio and the site's confidence in the result · Mob survival rate could exceed 100 %; chunk loading could go up to four times over its memory cap · Standard benchmark, stress limit and single tests unchanged; the affected profiles show a step in their history Also: stress.ramp.plateauBoost was never applied — it now is, so stress-freehost (the only bundled profile that turns it off) ramps without the boost. Six bundled profiles now say what they do; unedited copies are refreshed. free-host, stress-freehost and stress-monster have a new description, which is part of the profile hash: their new results are no longer grouped with earlier ones. Permissions · A kind: stresslimit profile now requires voxelbench.stresslimit, like /bench stresslimit, and is only offered to those who hold it · The profile screen requires voxelbench.custom or voxelbench.start; its refresh button runs /bench custom reload (voxelbench.reload) Smaller fixes World messages give advice that works (leftover folders, voxelbench_<name> to pin, Multiverse import) · /bench world list loses its [MV] marker, which never appeared · /bench verify tells apart a code for another server, an expired code, too many attempts and an already verified server · remote monitoring over the plan's server limit pauses and says what to do instead of retrying every minute · a second /bench link during a pending link is refused · /api/metrics gives ram_used and ram_free their real unit, % · /bench monitor web shows the HTTPS address when HTTPS is on · chunks VoxelBench force-loads are released after a crash, in every world · score screens use the site's weights (40/20/40) and say which tests make each score. Upgrade Drop the new jar in plugins/, restart. No config or data migration. Bundled profiles you never edited are refreshed. A group with voxelbench.custom but not voxelbench.stresslimit can no longer run stress profiles. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 25 required for MC 26.1 and later. Unchanged from 2.0.2.
    19 downloads
  6. 2.0.2Fix: fast machines get their score again4 weeks ago
    What's new A patch release with a single fix: on a fast machine, a benchmark could come back without any score. Everything else is identical to 2.0.1. Fast machines get their score again Every test sets aside its first seconds of TPS measurement: one second to settle, then five of warm-up meant for the gameplay tests, which build their zones and spawn their entities first. The hardware, CPU and network tests prepare nothing in the world, yet waited out the same six seconds. · The multi-core test does a fixed amount of work, so it ends sooner on a faster machine: on an 18-core server it finished in 6.0 s, before the first TPS sample · The test was reported as unmeasured, and no score was computed for the whole report · Disk, memory, multi-core and network tests now measure from their second second; gameplay tests keep their warm-up Scores are unchanged: operations per second and MB/s do not depend on that window, only the TPS figures shown alongside those tests now include seconds 2 to 5. Upgrade Drop the new jar in plugins/, restart. No config or data migration. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 25 required for MC 26.1 and later. Unchanged from 2.0.1.
    11 downloads
  7. 2.0.1Disk test fix - no more CPU spike or memory pile-up4 weeks ago
    What's new A patch release with a single fix, for the disk test — the first test of /bench start. Everything else is identical to 2.0.0. Disk test — no more CPU spike or memory pile-up The random 4K phases allocated a new off-heap buffer for every read and write: 500,000 per phase, about 24 GB of native memory over a standard run for a 1 GB test file, only released when the garbage collector next ran. · CPU at full load during the disk test: 6 to 7 s of CPU per 250,000 operations in our measurement · Native memory growing up to the size of your heap — on a tight container limit, enough to get the server killed · With ZGC and -XX:+DisableExplicitGC, the test stalled for good once the direct-memory limit was reached · Each thread now reuses one buffer: 0.2 s of CPU instead of 6 to 7, nothing held Random 4K results may rise on fast disks, since the allocation no longer counts in the measured time. Every other result is measured exactly as in 2.0.0. Upgrade Drop the new jar in plugins/, restart. No config or data migration. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 25 required for MC 26.1 and later. Unchanged from 2.0.0.
    6 downloads
  8. 2.0.0Profiler, memory inspection, real-time monitoring, audited measurementsSep 25, 2026
    What's new VoxelBench 2.0.0 brings together everything since 1.8.0 — coming from 1.8.0, everything below is new. Two built-in diagnostic tools (a profiler and memory inspection), remote monitoring rebuilt around real time, and a benchmark audited against its own claims. Scores are not directly comparable with 1.8.0 for memory and disk results, for lightingUpdate and tickingTileEntity, and on servers that lag under load. The standard gameplay load itself is unchanged. Compare 2.0.0 runs with 2.0.0 runs. Profiler — see what lags your server /bench profile [seconds] samples the tick threads (every region thread on Folia) with Java Flight Recorder — built into Java, nothing to download — and shows which plugins, which parts of the server and which methods they spend their time in, as percentages. · /bench profile ring on keeps the last minutes in memory; when the server lags (40 ticks of 100 ms+ in a row, or one tick of 1 s+) it dumps and analyses that window by itself · /bench profile share <id> — public unlisted link, valid 7 days, no account needed, like spark. IPs, host names, paths, UUIDs, tokens and player, world, user and machine names are removed first; unshare deletes it early. Official builds only · /bench profile upload <id> — private, into the voxelbench.com account your server is linked to; preview shows what would leave, /bench profile 30 share captures then sends · In the menus: a Profiler button (capture 30/60/120 s, ring buffer) and a Profiles archive in the Reports screen; read-only on the web dashboard too · Benchmarks are never profiled; sample counts and percentages, never made-up milliseconds · Experimental; permissions voxelbench.profile, .share, .upload (ops by default) Memory inspection — which plugin holds the memory /bench memory is spark's heapsummary and heapdump, built in — plus an analysis of the dump. A summary or an analysis stays on your server unless you share or upload it; a heap dump never leaves it. · /bench memory summary — objects of every class, attributed per plugin, server and Java; about 1 s of freeze for 1.5 GB in use · /bench memory dump — full .hprof; shows the expected freeze, file size and free disk first, runs only once confirmed; optional gzip. Refused when the freeze would reach the watchdog limit, unless you add force · A dump holds everything in memory: kept in heapdumps/, owner-only, 2 at most, never sent by any command · /bench memory analyze (or dump live analyze) — reads the dump in a separate low-priority Java process, never in the server: memory retained per plugin, leak suspects and the chain of fields that keeps each alive. A plugin caching 500 MB showed 0 % in a summary, about half the heap here · Free memory and the container limit are checked first — a quick analysis when the full one does not fit, refused with the figures when nothing fits; big heaps keep their object graph on disk (same report, down to a quarter of the memory) · /bench memory analyze last retained <plugin> — how much ONE plugin retains, with a fraction of the memory · Fewer false alarms: the static state of the server's own classes is shown apart instead of as a leak suspect, on Spigot, Paper, Folia and forks alike; duplicate strings count only the copies still in use · Safe on hosting panels: the chat says which -Xmx would leave room when the server's heap fills the container; memory-inspection.host-disk-limit-gb makes dumps count against your plan's disk limit; with a CPU quota of 2 cores or less the analysis takes only 30 % of one core · /bench memory share <id> (cleaned copy, public link, 7 days) and /bench memory upload <id> (your account) — for a dump, the analysis leaves, never the dump · In the menus: a Memory button next to the Profiler, and a Memory tile in the Reports screen; heap dumps stay command-only · HotSpot JVMs only; permissions voxelbench.memory, plus .dump, .share, .upload (ops by default) Forms and confirmations — no more long commands · Typed alone, /bench profile, /bench memory summary, dump and analyze open a form that builds the command for you — a native dialog on Paper 1.21.6+, an inventory screen elsewhere · Each form reopens on your last choices, even after a restart — except share/upload, force and which dump, which always start from their default · /bench confirm confirms your last preview, console included; players also get a Yes/No window Remote monitoring — on from the game, the whole interval, in real time · /bench monitor remote on|off|status — on lists what will be sent, checks in with the site and tells you what is left to do; any order works, it retries on its own and never rewrites config.yml · Each snapshot describes its whole interval — TPS, average / 95th-percentile / worst tick time, ticks over budget, seconds below 18 TPS — instead of one instant out of sixty · Real time: snapshots and uploads were counted in ticks, so at 10 TPS alerts went quiet exactly when TPS collapsed. Uploads now happen every minute · Folia: every region measured on its own, with its centre block as /tps shows it; headline figures carry the worst region · A frozen server shows as frozen; an empty server paused since 1.21.2 shows as paused, never while a player is online · Memory after GC, real process memory and the container limit; nothing lost on a full buffer, a failed upload or a shutdown · remote-monitoring.events settings finally apply Tick, GC and CPU metrics — without spark Every tick measured from startup, spark or not, and garbage collections one by one. · New placeholders: %voxelbench_mspt_p50%, _p95, _p99, _peak (optional _10s / _1m / _5m / _15m), %voxelbench_tps_10s% … _15m, %voxelbench_tick_source% · The web dashboard's metrics gain 10 s / 1 min / 5 min / 15 min windows Measurements you can trust Memory latency was mostly measuring the clock: 48 ns published, about 7 ns of it memory, and the same figure for cache and RAM. It now follows a chain of dependent loads — 14 / 105 / 199 ns on 256 KB / 8 MB / 512 MB. · Random 4K disk I/O read back the page cache; it now uses direct I/O, published only when the cache bypass succeeded · Four timed loops were timing a random number generator (disk write could never exceed 290 MB/s); data is now prepared before the clock starts · Samples below 15 TPS were discarded as "not representative" — sustained lag is now measured · lightingUpdate and tickingTileEntity now measure the load they announce · /bench start always runs the same load, whatever config.yml says — default installs see no score change; reports record the difficulty /bench test — out of the world you stand in Single tests dug, cleared and generated chunks in the launching player's world. Every test that writes to the world now runs in the world pinned with /bench world set, otherwise in a temporary flat world deleted afterwards — or is refused. You are brought back where you were, and playerWorldLoad restores every block it touches. Custom profiles — the load they ask for A hidden hopper limit capped every profile at 10 lines. Profiles now run what they ask (up to 500 lines per zone), the bundled ones still say 10, and a new hopper-heavy profile runs 100 lines in 8 zones. New bundled profiles now reach existing installs once; edited ones are never overwritten. Folia — auto-bench runs again · On Folia, auto-bench did not run at all: it touched the player from the wrong region and aborted · A player reconnecting inside a leftover benchmark world is no longer stranded in spectator · Stress-limit restores position and game mode, /bench zones tp and startup cleanup work, zone cleanup sweeps each region on its own thread · Gameplay tests that write to the world need a pinned world on Folia Permissions
    12 downloads
  9. 1.8.0Deadlines that hold when your server doesn'tSep 6, 2026
    What's new A bench whose deadlines no longer stretch at the exact moment they should hold, and that says what it is doing when it gives up. Four user logs are behind this release; every fix carries the measurement that prompted it. Scores remain comparable with 1.7.x — no formula changed. Runs no longer stall between two tests Nothing watched the gap between tests. One test's watchdog is cancelled as finishTest begins, the next one's is only armed inside its startTest — and in between sit the teardown of thousands of chunks and the whole setup of the next test. A reported run stopped there with no error at all, holding the global lock until a restart. · A run-level watchdog now covers that window · Its thresholds are derived from the ceilings each test declares — a hand-typed number would kill the memory test, which legitimately asks for fifteen minutes Waits are counted in seconds, not in ticks An eight-second settle window expressed in ticks stretches exactly in proportion to how useless it has become: the previous test just saturated the machine, and that is precisely why we are waiting. Measured on Folia during the mob-AI test, at 0.26 TPS: the old window's 160 ticks would have taken 615 seconds. They now take 8064 ms. This only affects waits whose subject does not come from the tick loop. TNT fuses, redstone timing, fluid propagation and per-tick chunk budgets stay in ticks — that is their correct unit. A test that proves it is progressing earns more time The memory test had a flat 300-second deadline. On a slow host its final pass needed 377 — the test was cut, and the whole report rejected. A test can now declare a reprieve: each completed unit of work pushes the deadline back, while an absolute ceiling stays in place. The reprieve renews on evidence — a finished pass — never on a heartbeat, or the watchdog would renew its own deadline forever. Messages now say what happened, and what to do A player read, in French chat: ⊘ Test ignoré: Mémoire — memoryPressure: projected peak heap 107.6% after pre-flight GC. A developer string, in English, naming a cause and never a remedy. · Every unfinished outcome now carries a typed reason: a stable code for the payload, a translated cause, and a computed remedy — the heap you would have needed, worked out, rather than "raise -Xmx" · A warning before the run when the heap will not be enough: the verdict was computable in the first second, you learned it in the eleventh minute · An end-of-run summary that ties the skipped tests together — three notices six minutes apart do not connect themselves A partial run is no longer thrown away A report missing a required test came back as HTTP 400 and nothing was kept. A host with 1670 MB of heap lost twelve correctly measured tests because the memory breaker had skipped three — that is, because the plugin had made three good decisions. · Reports now carry status and reasonCode, letting the service tell a protective skip from a crash · The report is kept and viewable, unscored and out of the leaderboards — scoring a run with a missing test would mean putting a number on something nobody measured Requires the updated service; without it the new fields are simply ignored. What the screen claimed without any way of being wrong /bench test disk reported "✓ Test passed", "TPS 20.00" and "MSPT 50.00 ms" — literals in the source code — and 0 MB/s for all six of its metrics, on an NVMe that had just measured 2621 MB/s. The measurement was correct in the payload; only the display lied, and in the costliest direction for anyone diagnosing a disk. A missing metric now shows "—" rather than "0": zero is a plausible throughput, and confusing the two reads as a dead disk where there is only a missing key. Quieter fixes · No key layers in MapLike[{}], logged at ERROR on every single run by our own bench-world creation. The fix existed but had been restricted to Folia; three Paper logs said otherwise. The terrain itself was always correct. · The pre-test memory collection bailed out of its loop on the first pass, mistaking "nothing left to collect" for "collection has not started yet". It now waits for proof that a collection happened — and admits it when none does. · The leak detector cried wolf: it compared a test's end to its start, so it measured what the test had just created and not yet cleaned up. A leak is what survives cleanup. · A test now waits for the previous one's chunks to actually unload rather than for a delay to elapse — unloading is produced by the tick loop. When the bound is reached, the log says so instead of staying silent. · The pre-flight check logs that it is waiting. When it opened its confirmation screen the command stopped without a trace: the server answered "No test running" and nobody knew why.
    41 downloads
  10. 1.7.1Cancelling a run now stops it on the spot, and a refused report finally says whyAug 17, 2026
    What's new Auto-bench only. Nothing else changes — no measurement, no scoring, no report field. Results from 1.7.0 and 1.7.1 are directly comparable. Stopping a benchmark now actually stops it Cancelling an auto-bench from the website disconnected the bot, which does end the run — the plugin waits 30 seconds for the player to come back, then gives up — but only at the next test boundary. Your server kept working for minutes after a cancel it considered done. The agent can now cut the run on the spot. · /vbautobot stop <nonce> — no permission, by design: the nonce is the authorisation, exactly like the launch command · The nonce is checked locally against the running job — no callback to the results service, and no nonce is spent · A nonce belonging to another job, a partial match, or none at all is refused, and the console says so Stopping your own benchmark no longer counts against your server /bench stop set the abort flag and force-stopped the test, but only ever told whoever typed the command. The auto-bench agent kept waiting for a result that would never arrive, timed out, and the run was recorded as a failure — five of which disable a target, each notifying its owner. For a stop that owner had just asked for. · An abort event is now emitted the moment a run is stopped, carrying who stopped it and how many runs had completed · It reaches whoever launched the run rather than whoever stopped it — the bot is the one waiting for an answer · Runs stopped this way are reported as a deliberate abort and no longer count towards the auto-disable A refused report now tells you why When the results service rejected a submission, the reason was sent only to the player's chat. On an auto-bench run that player is a bot, which reads nothing but the machine-readable event lines — so the reason went to the one party that could not understand it, and was dropped. The run ended as a bare failure, the console said nothing, and ten minutes of measurement were lost with no clue as to the cause. The reason now goes to the console first. A missing sensor can no longer destroy a finished run System info is collected when the report is built — after the whole benchmark — and nothing guarded it. On Windows the CPU-temperature probe fails on an ordinary machine, and a value no score even reads could take the entire report down with it. Every collector is now isolated and names itself if it fails. · A report missing one section beats a lost run · The console names the collector that failed, instead of staying silent Smaller fixes Abort events now fire immediately instead of at the next iteration boundary — which for a single-run job meant never · the abort event names whoever actually stopped the run instead of always reporting the agent · free-text values in bot-facing events go through one shared sanitiser rather than three copies of the same expression. Coming soon · Protocol support for Minecraft 26.2 in auto-bench, once the underlying protocol definitions are published Upgrade Drop the new jar in plugins/, restart. No config or database migration, and nothing to re-measure — this release does not touch the benchmark. Older agents keep working: they simply never send the stop command, and the new abort event is one more line they ignore. Java + compatibility Java 16+ for Minecraft 1.17 through the latest (including 26.x). Tested on Spigot, Paper and Folia.
    30 downloads
  11. 1.7.0The bench now proves that a test ran before it publishes that test's numberAug 13, 2026
    What's new Read this first — your old results do not carry over This release fixes what the bench was measuring, not how it scores. The explosion test detonated nothing, the measurement layer published a perfect server whenever it had failed to measure anything, and your server's own TNT cap silently limited how much load ever reached it. Benchmark and stress-limit results from 1.6.0 and earlier are therefore not shifted — for stressTnt (every platform) and stressHoppers (Paper, Spigot) they are void, and no Folia stress-limit result existed at all before this version. There is nothing to convert: re-run your campaigns. · Expect lower limits. That is the measurement becoming real, not your machine regressing. · No 1.6.0 report carries a single validity witness, so it is impossible to tell after the fact which cause applied to it. · Scale bounds changed too, so a tier number and a load value no longer mean what they meant. The explosion test now actually explodes Forcing a chunk loads it — it does not make its entities tick, and only a ticking entity burns a fuse. Charges were created, accepted by the server, then frozen: fuses still read 40/40 after ten seconds. Since frozen work costs a region nothing, TPS held at 20.00 and the TNT scale climbed to its configured ceiling on any machine, measuring entity spawning and platform construction. Zones now hold their own chunks and the measurement window does not open until they really tick. · Measured breaking points on the corrected scale: 1938 ±76 on Folia, 2229 ±92 on Paper, 2279 ±65 on Spigot · The corrected hopper scale breaks at 3112 ±71 on Paper — it previously returned 40 000 there, 121 on Spigot and 2 661 on Folia, three incompatible answers for the same test · On Paper the test now waits ~20 s for zone chunks to reach entity-ticking (measured: 9 → 200/200 chunks in 17.8 s). Announced in console every 5 s, on the scoreboard and in the action bar, capped at 30 s, and counted outside the measurement window — it is not a freeze A test that measured nothing can no longer publish a perfect score Sixteen fallbacks across the measurement layer all meant "healthy server", so the most degraded case of all — no samples at all — was published as 20.00 TPS / 0.00 ms, the single best result available. A tier is now stable only if it was proven stable; otherwise the verdict is "not measured", neither held nor broken, and the limit is under-estimated rather than left unbounded. · A tier the server could not detonate within its window is now a broken tier — explosion saturation was invisible to every other metric, since queued work costs nothing · A tier whose load was never censused stops being labelled "health score low", a message that was stored and shown to you as if the machine were at fault · A collapsed region that is too frozen to run its own sampler now publishes that collapse instead of vanishing from the report Your server's TNT cap no longer caps the benchmark in silence max-tnt-per-tick: 100 is the default on Spigot and Paper. A test posting 1200 charges never saw most of them tick, so it measured a config file rather than your machine — silently, on almost every host. The cap is now raised in memory for the duration of the test and restored on every exit path, including /bench stop, a timeout or an exception. Your spigot.yml is never written and a restart re-reads it intact. · Measured across two consecutive runs per platform: charges never ticked 300 → 0, charges presented 900 → 1200/1200, detonation ratio 0.89 → 1.00 · Set benchmark-tests.explosion.raise-host-tnt-quota: false to refuse any in-memory change — the run is then reported as partial and a console warning names the value to raise yourself · Reports carry hostMaxTntPerTick and hostTntQuotaRaised, so two runs of the same server stay distinguishable Reports now prove the test ran Every test carries a witness saying whether its entities actually moved, how many of its chunks really ticked entities, and how much of the announced load the server was actually given. Flags are raised only when something is wrong — a healthy report carries none, because a permanent flag is noise and noise stops being read. · New in reports: entityTickRatio, tntPresented, tntNeverTicked, detonationRatio, explodeForeign, zoneChunksEntityTicking, workCompleted with its unit, and per-tier measurementDegraded · Read the flags before the numbers: loadNotPresented, zoneTickingNotReady, zoneTickingCapped, entitiesNeverTicked, entityCensusPartial or regionTaskStarved describe a doubtful measurement, not a slow machine · Never read -1 as 0 — it means "cannot conclude", not "nothing moved" · On a populated server, TNT lit by your players or your redstone is now counted separately under explodeForeign instead of being credited to the machine under test Warm start — stress-limit runs stop climbing from zero The last stable value of each test is remembered, and the next run starts near 70 % of it instead of walking the whole scale again. If that warm probe breaks, the run refines downwards; if nothing holds there, it falls back to a clean full climb. Stale entries expire on their own. · Tunable under stress-limit.warm-start: enabled, factor, max-refine-down-steps, max-age-days · It makes a run depend on the previous run of that machine — set enabled: false when you are comparing two servers against each other A break has to repeat before it counts A broken tier is now replayed before the scale stops, on the way up and during refinement, with the confirmation tolerance tightened from 30 % to 12 %. An isolated hiccup no longer condemns a healthy machine. Runs take longer, and some limits go up for this reason. /bench tier — walk one scale on its own Run a single stress test up its scale to diagnose it, without launching a full stress-limit campaign. It never touches the warm-start memory and never submits as a stress-limit result. · /bench tier <test> [tiers=N] [from=N] [to=N] [duration=SEC] [zones=N] [cold] [noskip] — behind the new voxelbench.tier permission, op by default · from and to are loads, not tier numbers; use tiers=N to run only the first N Folia Headline TPS and MSPT now describe the measured window instead of being a moving-average snapshot read at the worst moment of the run, so every Folia headline number changes magnitude. Stress-limit runs also start on Folia at all, and an entity the current thread cannot read is no longer counted as a dead one — that single mistake had produced "no charges left", then "so they exploded", then "so a plugin is cancelling the damage", three conclusions stacked on missed reads. Rescaled Scale bounds moved because the real breaking points did. TNT starts at 40 per zone instead of 100 and tops out at 5 000 instead of 10 000; the chunk scale now counts chunks per second rather than per tick, with a ceiling of 2 000; the entity scale goes to 80 000 instead of 20 000. Tier numbering changes accordingly. Smaller fixes blocksDestroyed counted a ring of blocks nothing had destroyed, and the error grew with the load · explosionImpact published "no impact" — the best possible result — whenever nothing had been measured · protection plugins are no longer accused of suppressing damage on an absence of evidence, and suspected listeners are listed as suspects rather than as a verdict · forced chunks could survive the run, the plugin and a restart, since force-load is persisted into world data — a failed release is now logged instead of swallowed · the explosion probe stayed subscribed for the life of the server and ran on every real player's explosion · /bench test refused 8 of the 26 identifiers it advertises · /bench stop did not stop the run and left the server modified afterwards · chunk preloading could freeze
    12 downloads
  12. 1.5.0Full Folia support, per-region TPS/MSPT measurement, regionized reportsJul 5, 2026
    What's new Full Folia support — the entire benchmark now runs on Folia /bench start now runs the complete test suite on Folia. Every gameplay and hardware test executes correctly on Folia's regionized, multi-threaded world model — no more skipped or failing tests — so you finally get a full, comparable report on Folia just like on Paper or Spigot. · Chunk loading, mob spawning, redstone, block physics, chunk ticking, hoppers, explosions, lighting, tile entities, mob AI, bone-meal growth, liquids and more — all Folia-correct. · World setup, player teleport / gamemode / state, chunk loading and cleanup all run on the right region thread, so a Folia run no longer trips the server watchdog. Per-region performance measurement — numbers that actually reflect Folia On Folia the work is spread across region threads while the global region sits idle, so a single global TPS/MSPT reading is meaningless. The benchmark now samples TPS and MSPT per region and aggregates them (average across regions, plus best and worst region) into the same result fields you already know. · Reports are tagged as regionized with a region count, so a Folia result is read correctly and never compared apples-to-oranges against a single-threaded run. · New throughput (work-per-second) figures are added alongside the existing metrics — never replacing them — to better capture Folia's parallel model. Paper and Spigot — unchanged Every Folia behaviour is gated behind server detection. Paper and Spigot runs are byte-for-byte identical to 1.4.0 — same tests, same loads, same scores. If you don't run Folia, upgrading changes nothing about your results. Smaller fixes Fixed a gamemode race on state restore that could throw "Cannot set gamemode async" on Folia · temp benchmark worlds that Folia can't unload at runtime are now cleaned up on the next server start instead of erroring · stale "test timeout" log lines for tests that had already finished no longer appear · fixed leaked internal timers on Folia that slowly raised per-tick overhead and GC across a long run · chunk-ticking load is throttled on Folia so it no longer floods a single region. Coming soon · Extension API (preview) — third-party plugins can register their own benchmark tests against VoxelBench: typed parameters, declared output metrics, full lifecycle hooks, and mock helpers for unit tests. Functionally complete and exercised by the bundled sample plugins, but not officially announced for public use yet. Expect changes until the public release. Upgrade Drop the new jar in plugins/, restart. No config or database migration — everything ships with sensible defaults, and Paper / Spigot behaviour is unchanged. On Folia, note that a faithful Folia benchmark deliberately disperses its work across region threads: it shines on high-core-count machines and is intentionally slower on servers with only a few cores. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 21 recommended for MC 1.20.5+. Java 25 LTS for MC 26.1.x. Tested on Paper / Purpur / Pufferfish / Folia / Spigot.
    43 downloads
  13. 1.4.0Stress-limit overhaul, CPU kernels, rebuilt menu + in-game test configurationJun 17, 2026
    What's new Stress-limit, rebuilt — adaptive ramp, custom profiles, a 7th vector The stress-limit mode now ramps its tiers adaptively and measures lag faithfully, so a run keeps climbing until the server genuinely buckles instead of plateauing early or breaking on a false reading. · Adaptive tier ramp with faithful TPS/MSPT sampling — the standard load clamp is bypassed so each tier actually scales up until something gives. · Per-type starting loads calibrated from in-game testing, bounded measurement windows, and an inter-tier safety sweep of shared zones between tiers. · New villager-brain vector — piles on villager AI and pathfinding until the brain ticks drown the server (7 stress vectors total). · Custom stress profiles in YAML — drop a file in plugins/VoxelBench/custom_benchmarks/ to compose your own stress recipe (which vector, starting load, ramp), then run it from chat or the menu. CPU compute kernels — choose what you stress The single-core and multi-core tests can now run one of four compute kernels, so you can target the part of the CPU you care about instead of a single fixed workload. · int — integer ALU throughput · float — floating-point throughput · memory — memory-bound access pattern · branch — branch-prediction stress Selectable per test — via the command parameter, tab-completion, or the in-game configurator below. Interactive menu — rebuilt and catalogue-driven The /bench GUI got a large overhaul. Test menus now build themselves from the live test catalogue, so the menu never drifts out of sync with what the plugin can actually run. · New built-in tests — and third-party tests added through the extension API — appear in the menu automatically, no menu edits required. · Custom-profile browser — launch your YAML profiles straight from the menu. · New Mods and server config-profile screens, plus a dynamic stress menu. · Clearer tab bar, and a duplicate "Tests" entry removed from the main menu. · Full EN/FR localization of the new screens and of the test parameter labels. Configure tests in-game — a real form, with fallback everywhere On Paper 1.21.6+, opening a test brings up a proper configuration window instead of forcing you to remember the parameters. · One form per test — dropdowns for choice parameters, readable and translated labels, and free-text entry via shift-click. · On any other platform it falls back automatically to an anvil / chat / inventory configurator, so every server can still set parameters cleanly. Tab-completion — value suggestions Built-in tests now suggest sensible values for each parameter as you type, not just the parameter names. Tests added through the extension API get the same value completion. Environment flagging Benchmark reports now inventory the server's mods, plugins and configuration profile. This lets leaderboards spot and flag setups that inflate scores (tweaked view-distance, spawn limits, performance mods, …) so honest runs aren't drowned out by doctored ones. The plugin only reports the data — the flagging happens server-side. Smaller fixes Menus no longer blank out on a refresh or page change · stress-limit false ruptures and endless "hopper" tiers fixed, and tiers that never reached the breaking point now do · the explosion test's proportional load is gated to stress mode only, so the standard benchmark is unaffected · the pre-flight memory budget now anticipates a test's peak allocation · extension API bumped to 1.1.0 (suggested values; backward compatible, still preview). Coming soon · Extension API (preview) — third-party plugins can register their own benchmark tests against VoxelBench: typed parameters, declared output metrics, full lifecycle hooks, and mock helpers for unit tests. The surface is functionally complete and exercised by the bundled sample plugins, but isn't officially announced for public use yet. Expect changes until the public release. Upgrade Drop the new jar in plugins/, restart. No config or database migration — new options ship with sensible defaults. On Paper 1.21.6+ the in-game configuration windows light up automatically; every other platform keeps the anvil / chat / inventory flow. Custom stress profiles live next to the benchmark profiles in plugins/VoxelBench/custom_benchmarks/ — delete the samples you don't need. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 21 recommended for MC 1.20.5+. Java 25 LTS for MC 26.1.x. Tested on Paper / Purpur / Pufferfish / Folia / Spigot. The in-game configuration windows require Paper 1.21.6+; everything else degrades gracefully on older or non-Paper platforms.
    46 downloads
  14. 1.3.0Three-layer OOM protection, hosting tier detection, /bench info rewriteMay 31, 2026
    What's new Memory hardening — three-layer protection against OOM Low-RAM hosts (≤ 4 GB heap) used to accumulate residual garbage between tests and eventually crash with OutOfMemoryError. Three layered guards now make that virtually impossible: · Post-cleanup GC — every test triggers an aggressive 3-cycle GC at the end of cleanup. Recovers the 10-15 % of peak heap each test would otherwise leak. · Pre-flight memory budget — before starting a test, heap usage is checked: under 75 % proceeds; 75-85 % warns and runs a pre-emptive GC; 85 %+ refuses the test as Skipped with reason memoryPressure. · Runtime OOM watchdog — async poller aborts the active test if heap stays at 92 % for 3+ consecutive seconds, before the JVM crashes hard. All three are togglable via config.yml under benchmark.post-cleanup-gc, benchmark.memory-budget.*, benchmark.memory-watchdog.*. Hosting environment detection — know what host you're on Five probes (filesystem, plugins, env vars, JVM resources, cgroups) classify the host into one of five tiers: DEDICATED_OR_VPS → LIKELY_PAID_HOSTED → SUSPECTED_FREE → LIKELY_FREE → CONFIRMED_FREE. Vendor-specific markers identify Aternos, Minehut, FalixNodes, Server.pro and the MSH hibernation wrapper. Surfaces as a chat warning at /bench start when free-tier is detected, and as a new hostingEnvironment block in benchmark reports so the leaderboards can filter unreliable runs out automatically. Hardware introspection — disk type + DDR modules Reports now carry primary-disk classification ( NVMe / SSD / HDD / RAMDISK, plus model, size and mount point) and per-module memory detail (DDR3/4/5 type, MHz, capacity, manufacturer). Both visible in the disk and memory info GUIs as dedicated tiles. When the underlying platform doesn't expose this (e.g. memory modules on a Linux container without SMBIOS access), fields land as stable UNKNOWN / -1 sentinels rather than being silently dropped. Preflight confirmation GUI — replaces the double-/bench start text confirm A new inventory GUI opens when /bench start detects risks. Each risk is a coloured tile ( critical, warning, info) with full details on click. Detected risks include: non- voxelbench_* world targeted (critical), world not flat, other players online, server already laggy, hosting tier free, plugin interference (WorldGuard / GriefPrevention / Spark / etc.). Critical findings disable the green Start button — only an orange Force button (visible with voxelbench.start.force) can launch through them. Clean reports skip the GUI entirely and start directly. /bench info — full rewrite with 15 sub-sections · Existing sections enriched (cpu, ram, disk, network, spigot, java, system) — previously most showed just a title and one line. · Brand new: performance (live TPS/MSPT/CPU), plugins (list with enabled state), worlds (per-world chunks/entities/players/seed), sensors (CPU temp/voltage/fans), auth (mode/server ID/rate limit), bench (last run summary), build (version/profile/JVM args), hosting (tier/signals). · Pixel-perfect column alignment via a new chat-font width calculator (mixes regular and bold spaces for 1-pixel padding precision). · Tab completion suggests all 15 sections. · /bench info auth masks the server ID by default (shows abcd…wxyz (64 chars)); /bench info auth hash reveals it. Tri-state outcomes now actually visible in chat Until this release every test ended with ✓ Test complete regardless of whether the watchdog killed it or the memory budget refused to start it. The chat now branches on the real status: ✓ Test complete (green) / ⊘ Test skipped — reason (yellow) / ✗ Test failed — reason (red). Backend errors surfaced in chat A HTTP 400 from the backend now reads as Invalid report data: HTTP 400 — missing required field 'X' at /tests[2]/status instead of just HTTP 400. New bundled custom profiles · free-host.yml — divided by ~10 vs standard, designed to stay under Aternos / MSH / similar free-tier killers (TPS killer, RAM cap, CPU throttle). Documented as non-comparable with /bench start. · low-memory.yml — divided by ~3, for paid VPS / small dedicated hosts with 2-4 GB heap. Comparable across runs of itself. The three preset profiles from v1.2.0 ( standard, showcase, example) are still there. Standard chunkLoading reduced The standard benchmark's chunkLoading test went from 5000 chunks/zone × 8 zones = 40 000 chunks down to 2000 × 8 = 16 000. The previous value routinely tripped the new OOM watchdog at ~92 % heap on 6 GB hosts; 16 000 stays comfortably under the budget. Critical fixes · /bench stop was lying — three coupled bugs meant the test kept running for minutes after stop, the scoreboard stayed visible, and a fake ✓ Test complete could appear long after. All three fixed: the active test is force-cancelled synchronously, the scoreboard is removed immediately, late callbacks are suppressed. · Successful tests reported as failed — an internal status field wasn't being synced with the success boolean, so every test that succeeded was internally flagged FAILURE. Silent until the new chat outcome logic started reading it, then every success appeared as ✗ Test failed. Fixed. · /bench info tab-completion stale — was suggesting 4 obsolete categories. Now lists every actual sub-section. Smaller fixes Anonymisation extended to cover the new hardware blocks (mount-point masked in PARTIAL, disk model generalised in FULL, RAM part numbers hashed in PARTIAL / redacted in FULL) · Server ID masked by default in /bench info auth · Preflight GUI treats Esc as cancel · Every new behaviour has a config.yml toggle with sensible defaults. Coming soon · Extension API (preview) — still on track. Same surface as v1.2.x with new typed parameter / metric / completion / structured-version-comparison primitives. Not officially announced for third-party use yet — expect changes until the public release. Upgrade Drop the new jar in plugins/, restart. No config or database migration required — new options are added with sensible defaults. The first run after upgrading may show one or two Skipped outcomes on a low-RAM host: that's the new memory budget check refusing tests that would have crashed the JVM — inspect heap with /bench info ram or raise -Xmx. The two new preset profiles ( free-host.yml, low-memory.yml) will appear in plugins/VoxelBench/custom_benchmarks/ alongside the existing ones — delete the ones you don't need. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 21 recommended for MC 1.20.5+. Java 25 LTS for MC 26.1.x. Tested on Paper / Purpur / Pufferfish / Folia / Spigot / Mohist 1.20.1 + 1.20.2 / Arclight 1.20.1 + 1.20.4.
    20 downloads
  15. 1.2.1Custom profiles, backend-driven runs, Arclight Compat and preview APIMay 22, 2026
    What's new · Custom benchmark profiles — /bench custom A new way to compose your own benchmark recipes from YAML, without writing code. Drop a file in plugins/VoxelBench/custom_benchmarks/ and pick which tests run, in what order, with what parameters. · /bench custom run — execute a profile · /bench custom list — see what's loaded · /bench custom info — view the steps and params · /bench custom reload — re-scan the folder without restart ​ Ships with three preset profiles: standard.yml (mirrors the built-in benchmark), showcase.yml (every test and every parameter, fully commented — use as a reference), example.yml (minimal starter). Profiles carry their own name, description, author, version and tags; the backend uses a normalized profile hash to recognize the same recipe across servers. · AutoBench — backend-driven benchmark scheduling /bench autobot [args] — entry point for a backend-driven agent (typically a mineflayer bot connecting as a real player) that orchestrates benchmark runs server-side. Supports single-run, multi-run with abort detection, and live progress events. The agent is force-gamemode'd to SPECTATOR on entry so it never falls to its death in a fresh world. · Hybrid server support — Mohist & Arclight Benchmark worlds on hybrid Forge/Bukkit servers used to come out with hills, trees and caves instead of flat terrain. They now generate genuinely flat. Tested on Mohist 1.20.1 and Arclight 1.20.1 / 1.20.4. Detection covers the full hybrid family (Mohist, Arclight, Banner, NeoTenet, Magma, CatServer, Cardboard). · Persistent benchmark worlds Worlds created with /bench world create now auto-reload on every server start, even without Multiverse-Core. The command also refuses to overlay a stale folder, preventing mixed-terrain chunks if you recreate over an existing one. Temp benchmark worlds from crashed previous sessions get auto-cleaned at startup. · Sharper /bench commands · /bench tests — alias of /bench test, fully tab-completable · /bench help — explicit help command, no longer hidden behind unknown subcommands · /bench tests list — dynamic listing built from the live test registry, grouped by category · Console-aware listing — /bench test from console shows two groups: scriptable hardware tests and those requiring a real player · Unknown subcommands now print Unknown subcommand 'X' instead of silently dumping the help ​ · Test parameters via key=value /bench test foo count=50 timeoutMs=2000 now actually passes the values to the test. Tab completion suggests the available keys for each test. · Tri-state outcomes Tests can now report Skipped (test inapplicable, e.g. an optional mod isn't installed) distinct from Failed (server lost). Skipped tests render in yellow ⊘ with the reason and stay out of failure stats — backends should exclude them from leaderboards rather than count them as losses. · /bench custom run respects your pinned world Custom profiles used to ignore /bench world set and silently spawn a temp world. The pinned world now wins; the profile's auto-temp-world setting only kicks in as fallback. · Sharper failure messages When a test fails, the reason now displays in chat instead of a bare ✗ Test failed line. · MC 26.1.x readiness WorldTimeStabilizer resolves daylight-cycle gamerules by name across MC 1.17 → 26.1.x; defensive world.setTime handles dimensions without a world clock (custom Forge dimensions). Compile path verified against Spigot 26.1.2 API. Smaller fixes Boolean metrics display "Yes/No" properly · Entity-spawn tests pre-load chunks on hybrid servers (no more silent 0-spawn runs) · Parameter clamp warnings reach the operator in chat · Built-in tests (chunkLoading, chunkTicking, lightingUpdate, explosion) promoted to rich-metric format · Startup logs quieter (spurious scoreboard warnings demoted) Coming soon · Extension API (preview) — a new public API will let third-party plugins register their own benchmark tests against VoxelBench: typed parameters, declared output metrics, full lifecycle hooks, JUnit mock helpers. The surface is functionally complete and exercised by the bundled samples in the project repo, but isn't officially announced for public use yet. Expect changes until the public release. Stay tuned. Upgrade Drop the new jar in plugins/, restart. No config or database migration. If you have an existing voxelbench_ world from a previous version, delete it before restart — terrain generated before this release isn't consistent with the new flat generator. The first time the plugin starts, three preset custom profiles will appear in plugins/VoxelBench/custom_benchmarks/ — feel free to delete the ones you don't need. Java + compatibility Java 16+ for MC 1.17 → 1.21.x. Java 25 LTS for MC 26.1.x. Tested on Paper / Purpur / Pufferfish / Folia / Spigot / Mohist 1.20.1 / Arclight 1.20.1 + 1.20.4.
    22 downloads
  16. 1.1.0Pick the world your benchmarks run inMay 1, 2026
    What's new · /bench world — choose any loaded world as your benchmark world, or create a flat one in one command: /bench world create <name> — flat normal world, auto-prefixed voxelbench_, fixed seed for repeatable results /bench world set <name> — pin it for every future benchmark /bench world unset — back to the default behaviour /bench world list / show — see what's pinned, what MV manages /bench world delete <name> — only voxelbench_* worlds, never your survival map​ The pinned world is honoured by /bench start, /bench stresslimit, /bench test, multi-run warmups and post-run cleanup. · Multiverse-Core integration — drop-in support for Multiverse 4.x and 5.x. Created worlds appear in /mv list, deleted worlds are un-registered cleanly. Falls back to Bukkit's native API when MV is not installed, so the feature works on every server. · Crash-proof player rescue — disconnecting (or restarting the server) mid-benchmark used to leave you stuck inside the bench world. Your pre-test position and gamemode are now persisted to disk and restored automatically the next time you log in. · Console safety — gameplay benchmarks can no longer be run from the console (they always silently misbehaved without a real player). Hardware tests stay scriptable: memory, disk, multicore, singlecore. · A SPECTATOR fix you'll feel — players teleported into a fresh benchmark world managed by Multiverse used to land in SURVIVAL and immediately fall to their death. They now correctly arrive in spectator mode regardless of per-world gamemode plugins. · Hook visibility — at startup the plugin prints a clear summary of which third-party plugins it has hooked into. Upgrade Drop the new jar in plugins/, restart. No config or database migration. If you don't use /bench world, the plugin behaves exactly like v1.0.2. Java requirement Java 16+ for MC 1.17 to 1.21.x. Java 25 LTS required if you run MC 26.1.x (Mojang's requirement, not ours).
    32 downloads
  17. 1.0.2Compatibility & quality updateApr 27, 2026
    What's new · Minecraft 26.1.x supported — drop-in compatible with Mojang's new year-based versioning (26.1, 26.1.1, 26.1.2). · Tested across the full 1.17 to 26.1.2 range — every release is now boot-tested daily on real Paper servers. Compatibility regressions get caught before you do. · Six new entity types recognized — armadillo, breeze, bogged, wind charge, creaking, happy ghast. · Adventure formatting library updated to 4.26.1 (used for MiniMessage rendering in chat output). Upgrade Drop the new jar in plugins/, restart. No config or database migration. Java requirement Java 16+ for MC 1.17 to 1.21.x. Java 25 LTS required if you run MC 26.1.x (Mojang's requirement, not ours).
    17 downloads
  18. 1.0.1Web Dashboard InternationalizatioApr 23, 2026
    - Added DashboardI18n — .properties-based translation loader. English (en_US) is now the default, French (fr_FR) is optional, and new languages can be added by dropping a single .properties file under resources/dashboard/lang/. - Replaced all hardcoded French strings on the three dashboard pages (login, dashboard, API-only) with i18n lookups. - Added a language selector dropdown on all three pages, with choice persisted through the voxelbench_locale cookie (1 year, SameSite=Lax). - Locale resolution priority: cookie → Accept-Language header → en_US fallback. - Translated monitor server logs to English for international consistency.
    63 downloads
  19. 1.0.0Apr 13, 2026
    62 downloads

Similar projects

Plugin →