Commands Reference
All VoxelBench commands start with /bench. Aliases: /benchmark, /b.
Type /bench or /bench help to list the commands in-game. An unknown sub-command prints an error followed by the same list.
Player or console?
/bench start,/bench stresslimit,/bench tier,/bench custom run,/bench guiand the tests marked "No" in the test tables must be run by a player connected to the server: they rely on chunk activation, entity ticking and player state save/restore./bench zones tp,/bench reportsand/bench reports gui,/bench lang auto,/bench monitor guiand/bench monitor bars <metric>also need a player. The other commands also work from the console.
Every command requires voxelbench.use. The Permission column shows what a command needs on top of it (voxelbench.use = nothing more); see Permissions for the details.
General Commands
| Command | Permission | Description |
|---|---|---|
/bench help (alias ?) | voxelbench.use | List all commands |
/bench gui | voxelbench.gui | Open the main GUI (player only) |
/bench status | voxelbench.use | Show the operating mode, plugin version, running test, rate-limit cooldown and last score |
/bench version (aliases ver, v) | voxelbench.use | Show the plugin version |
/bench info [topic] | voxelbench.info | Show system information. Without a topic, shows everything. Topics: cpu, ram, disk, network, server, java, system, hosting, performance, plugins, worlds, sensors, auth, bench, build |
/bench tps | voxelbench.use | Compare the TPS reported by the server with VoxelBench's own measurement |
/bench mspt | voxelbench.use | Same comparison for MSPT |
/bench lang [code|auto] | voxelbench.lang | Show or change your language; auto goes back to detecting it from your client. From the console, /bench lang <code> changes the server's default language |
/bench reload | voxelbench.reload | Reload config.yml |
/bench ping | voxelbench.use | Test the connection to the VoxelBench backend (DNS, then TCP/TLS/HTTP) to diagnose submission failures |
/bench confirm | voxelbench.use (+ the confirmed command's own nodes) | Confirm your last preview — a heap dump, or upload/share … preview — without retyping the whole command. See Confirming a Preview |
Benchmark Commands
| Command | Permission | Description |
|---|---|---|
/bench start [force] [warmup] [runs] | voxelbench.start (force: also voxelbench.start.force) | Run the full benchmark (player only) |
/bench stop (alias cancel) | voxelbench.stop | Stop the running benchmark, test or stress run, including a multi-run session waiting for its next iteration |
/bench zones | voxelbench.use | List the test zones of the last run, in the world it used |
/bench zones tp <number> | voxelbench.world | Teleport to a test zone (0 = default zone; player only) |
/bench zones clean <number|all> | voxelbench.world | Remove entities and dropped items left around a test zone, in a voxelbench_* world only |
/bench world ... | voxelbench.world | Manage benchmark worlds (see below) |
/bench zones shows the zones of the last run that laid some out since the server started (a benchmark, stress limit, tier, custom profile or auto-bench run; /bench test records none) and names the world that run used. A temporary world is deleted at the end of its run, and its zones with it: the command then says that the world no longer exists, and points at no other world. With no run recorded, it shows the default zone of the pinned world, if there is one. clean removes every entity except players, paintings and item frames within 200 blocks of each zone, and only in a voxelbench_* world: in any other world, the main world or a pinned world with another name, it removes nothing and says why. Each test already removes what it spawned, including when /bench stop interrupts it; the extra sweep of the fixed test spots that follows /bench stop also only happens in a voxelbench_* world.
VoxelBench 2.0.2 and earlier: on Paper and Spigot,
/bench start,/bench stresslimit,/bench tierand/bench custom runremoved villagers, animals (tamed and named ones included), golems, dropped items, minecarts and boats from every loaded world as the run started;/bench stopremoved villagers, cats, golems and dropped items around fixed spots of the test's world, whatever it was; and without a pinned world,/bench zones cleanswept a zone of the main world. Update before running them on a server whose worlds matter. See Safety Guards.
Full Benchmark
/bench start
Runs the test suite in three phases: hardware, then gameplay, then CPU (see Benchmarks). Results are submitted to voxelbench.com.
The arguments can be given in any order:
| Argument | Effect |
|---|---|
force | Ignore the local rate-limit cooldown (requires voxelbench.start.force) |
warmup | Run one extra warm-up benchmark first; its results are discarded and no report is sent |
<runs> | Number of consecutive benchmarks, from 1 to 20 |
Examples:
/bench start 5
/bench start warmup 3
/bench start force warmup 3
When confirmation.require-confirmation is true (the default), VoxelBench runs pre-flight checks before starting. If nothing is found, the benchmark starts immediately. Otherwise an inventory screen lists the findings and you click to start or cancel. Critical findings, such as targeting a world that is not a voxelbench_* world, can only be overridden by a player with voxelbench.start.force.
Multi-Run Mode
With more than one run (or with warmup), VoxelBench pre-loads the chunks around the test zones, reuses the same zones and world for every run, and waits 10 seconds before the next run. In a voxelbench_* world (the temporary world, or one made with /bench world create) it also resets the test regions between runs, so that each run starts from freshly generated terrain; in any other world it forces nothing and deletes nothing, says so, and the runs reuse the chunks already generated. Each run produces its own report. See Benchmark Worlds.
VoxelBench 2.0.2 and earlier: without a pinned world, a multi-run session reset regions of the server's main world between runs. Update before running one, or pin a
voxelbench_*world.
Benchmark Worlds
| Command | Description |
|---|---|
/bench world list | List the loaded worlds with their type: [pinned] marks the pinned world and [bench] the voxelbench_* worlds; the last line tells whether Multiverse-Core is detected |
/bench world show | Show the pinned benchmark world |
/bench world set <name> | Pin a loaded world for every benchmark, test and stress run |
/bench world unset | Remove the pin |
/bench world create <name> | Create a flat world named voxelbench_<name> |
/bench world delete <name> | Delete a voxelbench_* world (any other world is refused, as is a world where a test is running) |
Individual Test Commands
| Command | Permission | Description |
|---|---|---|
/bench test (alias tests) | voxelbench.use | List every registered test by category, including tests added by extensions |
/bench test <id> [parameters] | The test's node (see the tables below) | Run one test |
Test IDs are case-insensitive, and - or _ are ignored: chunkLoading, chunkloading and chunk_loading are the same test. Positional values (below) only work with the names of the positional table, in any case; with another spelling, such as chunk_loading, the test takes key=value pairs.
Available Tests
VoxelBench ships 26 built-in tests. The "Console" column tells whether the test can be started from the console. When a player-only test is launched from the console, the error message names a few examples and points to /bench test list; the tables below are the full list.
Every gameplay test except worldSave writes to the world, so /bench test runs it in the pinned world or in a temporary world, never in the world you are in, and refuses it when neither is available (always the case on Folia without a pinned world). See Benchmarks.
Hardware
| Test | Console | Permission |
|---|---|---|
disk | Yes | voxelbench.test.disk |
network | No | voxelbench.test.network |
memory | Yes | voxelbench.test.memory |
multiCore | Yes | voxelbench.test.multicore |
Single-Core CPU
| Test | Console | Permission |
|---|---|---|
singleCoreBenchmark | Yes | voxelbench.test.singlecorebenchmark |
singleCoreMax | Yes | voxelbench.test.singlecoremax |
Gameplay
| Test | Console | Permission |
|---|---|---|
chunkLoading | Yes | voxelbench.test.chunkloading |
mobSpawn | No | voxelbench.test.mobspawn |
hopper | Yes | voxelbench.test.hopper |
explosion | Yes | voxelbench.test.explosion |
lightingUpdate (alias lighting) | Yes | voxelbench.test.lighting |
worldSave | Yes | voxelbench.test.worldsave |
redstone | Yes | voxelbench.test.redstone |
blockPhysics | Yes | voxelbench.test.blockphysics |
chunkTicking | Yes | voxelbench.test.chunkticking |
entityCollision (alias collision) | No | voxelbench.test.collision |
tickingTileEntity (alias tileentity) | Yes | voxelbench.test.tileentity |
mobAI | No | voxelbench.test.mobai |
mobPathfinding | No | voxelbench.test.mobpathfinding |
villagerTrading (alias villager) | No | voxelbench.test.villager |
boneMealGrowth | Yes | voxelbench.test.bonemealgrowth |
liquidPhysics | No | voxelbench.test.liquidphysics |
combatSimulation | No | voxelbench.test.combatsimulation |
projectileStorm | Yes | voxelbench.test.projectilestorm |
entityCramming | Yes | voxelbench.test.entitycramming |
playerWorldLoad | Yes | voxelbench.test.playerworldload |
Test Parameters
Most tests run with their default values when no parameter is given. Two syntaxes exist, depending on the name you type.
Positional values. These names take plain values in a fixed order:
| Command | Notes |
|---|---|
/bench test disk <threads> <queueDepth> <size> [passes] | Required. Size accepts 512M, 2G or a number of MB |
/bench test memory <tableSize> <operations> <passes> | Required, e.g. /bench test memory 512M 75k 3 |
/bench test multiCore <tasks> <iterationsPerTask> [kernel] | Required. Iterations accept 100k or 5M; kernel is int, float, memory or branch |
/bench test singleCoreMax [operations] [passes] | |
/bench test network [objects] [LOW|MEDIUM|HIGH] | |
/bench test chunkLoading [chunks] [zones] | |
/bench test mobSpawn [mobs] [zones] | |
/bench test hopper [lines] [zones] | |
/bench test explosion [tnt] [zones] | |
/bench test mobPathfinding [mobs] [seconds] | |
/bench test redstone [pistons] [seconds] | |
/bench test blockPhysics [blocks] [spawnIntervalTicks] | |
/bench test lighting [updates] [zones] | |
/bench test collision [items] [entities] [seconds] | |
/bench test tileentity [total] [FURNACE|HOPPER|SPAWNER|ALL] [zones] | |
/bench test villager [villagers] [houses] [seconds] | |
/bench test chunkTicking [chunks] [tickSpeed] [seconds] | |
/bench test boneMealGrowth [saplings] [crops] [seconds] | |
/bench test liquidPhysics [water] [lava] [seconds] | |
/bench test combatSimulation [zombies] [skeletons] [pillagers] [seconds] | |
/bench test mobAI [villagers] [houses] [hostiles] [phase1Seconds] [phase2Seconds] |
Named values. Every other test ID (lightingUpdate, entityCollision, tickingTileEntity, villagerTrading, projectileStorm, entityCramming, playerWorldLoad, singleCoreBenchmark, and tests added by extensions) takes key=value pairs:
/bench test projectileStorm projectilesPerWave=250 durationSeconds=20
/bench test singleCoreBenchmark durationSeconds=15 kernel=float
The parameter names are the ones used in custom profiles; the bundled custom_benchmarks/showcase.yml documents them for every test. Out-of-range key=value values are clamped, with a warning. An out-of-range positional value is refused in most cases, with an error that gives the allowed range.
Stress Limit Commands
| Command | Permission | Description |
|---|---|---|
/bench stresslimit [force] | voxelbench.stresslimit | Run the stress limit mode on every stress type (player only). Type the command a second time within 10 seconds to confirm. force ignores the rate-limit cooldown (requires voxelbench.start.force) |
/bench tier <type> [options] (alias palier) | voxelbench.tier | Run the tier ladder on a single stress type, without confirmation or rate limit (player only) |
See Stress Limit for the stress types and the /bench tier options.
Custom Profile Commands
| Command | Permission | Description |
|---|---|---|
/bench custom list (alias ls) | voxelbench.custom or voxelbench.start | List the loaded profiles, tagged [STD] (benchmark) or [STRESS] (stress limit) |
/bench custom info <name> (alias show) | voxelbench.custom or voxelbench.start | Show a profile's metadata and steps |
/bench custom run <name> [force] | voxelbench.custom or voxelbench.start; a stress limit profile also needs voxelbench.stresslimit | Run a profile (player only, requires a linked server) |
/bench custom reload | voxelbench.custom or voxelbench.start, and voxelbench.reload | Re-scan plugins/VoxelBench/custom_benchmarks/ |
/bench custom run also accepts warmup and a run count, but profiles currently always run a single iteration. Without voxelbench.stresslimit, stress limit profiles are left out of the tab completion of run, of the profiles screen of the GUI and of the list of available profiles printed after an unknown name; list and info still show them. See Benchmarks - Custom Profiles.
Monitoring Commands
| Command | Permission | Description |
|---|---|---|
/bench monitor | Any of voxelbench.monitor, voxelbench.monitor.bars, voxelbench.monitor.web | Open the boss bar monitoring GUI (players with voxelbench.monitor.bars) or show the status |
/bench monitor status | Any of voxelbench.monitor, voxelbench.monitor.bars, voxelbench.monitor.web | Show the status of boss bars, web server, push mode and remote monitoring |
/bench monitor reload | voxelbench.monitor | Reload the whole config.yml, as /bench reload does, and apply the monitoring settings (including remote-monitoring) |
/bench monitor bars [on|off|all|<metric>] | voxelbench.monitor.bars | Toggle the TPS + MSPT boss bars, show all metrics, or toggle one metric (tps, mspt, ram, ramfree, cpu, entities, chunks, players; player only) |
/bench monitor web [start|stop|status] | voxelbench.monitor.web | Start, stop or check the web dashboard (without argument: toggle). start and status print its local address: http://localhost:<web-port>, or https://localhost:<https.port> when HTTPS is on |
/bench monitor web dashboard <on|off> | voxelbench.monitor.web | Enable or disable the HTML dashboard (API-only when off) |
/bench monitor push [start|stop|test|status] | voxelbench.monitor.web | Control push mode; test sends one request to check the settings |
/bench monitor remote [on|off|status] | voxelbench.monitor.web | Send metrics to your voxelbench.com dashboard: on enables it and checks the connection now, status shows where it stands (without argument: status). See voxelbench.com Dashboard |
/bench monitor auth | voxelbench.monitor.web | Show the dashboard authentication status |
/bench monitor auth password <password> | voxelbench.monitor.web | Set the dashboard password (12+ characters, stored as a PBKDF2 hash) and enable authentication. Server console only |
/bench monitor auth username <name> | voxelbench.monitor.web | Set the dashboard username |
/bench monitor auth key <pull|push> | voxelbench.monitor.web | Generate an API key for reading /api/metrics (pull) or for push mode (push) |
/bench monitor whitelist [on|off|list] | voxelbench.monitor.web | Show, enable, disable or list the IP whitelist |
/bench monitor whitelist add <ip> | voxelbench.monitor.web | Add an IP to the whitelist |
/bench monitor whitelist remove <ip> | voxelbench.monitor.web | Remove an IP from the whitelist |
/bench monitor whitelist mode <all|dashboard|api> | voxelbench.monitor.web | Choose what the whitelist protects |
/bench monitor https [on|off|status] | voxelbench.monitor.web | Enable, disable or check HTTPS |
/bench monitor https generate [days] | voxelbench.monitor.web | Generate a self-signed certificate (365 days by default) |
/bench monitor https password <password> | voxelbench.monitor.web | Set the keystore password manually |
See Monitoring for details.
Profiling Commands (experimental)
Sample the tick threads with Java Flight Recorder and show which plugins and methods run on them. Nothing leaves the server unless you upload a profile yourself with /bench profile upload, or share one by public link with /bench profile share. Captures are refused while a benchmark, stress limit, tier or auto-bench run is in progress, or a /bench test whose result is sent to voxelbench.com, and for 30 s after it.
| Command | Permission | Description |
|---|---|---|
/bench profile [seconds] [period-ms] [upload|share] | voxelbench.profile (+ the node of the verb) | Timed capture: 30 s by default (5-300), one sample every 10 ms by default (10-50), then a summary in chat; with upload (alias send) or share, the profile is sent as soon as it is saved |
/bench profile ring <on|off|status|dump [seconds] [upload|share]> | voxelbench.profile (+ the node of the verb) | Control the continuous ring buffer (off by default) and analyse its last seconds, optionally sending the result |
/bench profile list | voxelbench.profile | Saved profiles, newest first |
/bench profile show <number|id|last> | voxelbench.profile | Print a saved profile's summary again |
/bench profile delete <number|id|last> | voxelbench.profile | Delete a saved profile |
/bench profile upload <number|id|last> [preview] | voxelbench.profile + voxelbench.profile.upload | Send that one profile to the voxelbench.com account of this (linked) server now; preview only shows what would leave, then confirm within 60 s sends exactly that |
/bench profile share <number|id|last> [preview] | voxelbench.profile + voxelbench.profile.share | Publish a cleaned copy behind a public, unlisted link now (no account, expires after 7 days); preview only shows what would leave, then confirm within 60 s publishes exactly that |
/bench profile unshare <number|id|last> | voxelbench.profile + voxelbench.profile.share | Delete a profile's public link before it expires |
/bench profile status | voxelbench.profile | JFR availability, running capture, ring buffer, automatic dumps, saved profiles |
See Profiling for how to read the results and how automatic dumps on lag work.
Memory Inspection Commands (experimental)
See what fills the server's memory, per plugin, write a full heap dump — the equivalent of spark's heapsummary and heapdump — and analyse it in a separate process to see which plugin retains the memory. A summary or an analysis leaves the server only when you upload it with /bench memory upload or share it by public link with /bench memory share; a heap dump never leaves it, by any command. Refused while a benchmark, stress limit, tier or auto-bench run is in progress, or a /bench test whose result is sent to voxelbench.com, and for 30 s after it.
| Command | Permission | Description |
|---|---|---|
/bench memory [status] | voxelbench.memory | Heap usage, what the Java runtime supports, saved summaries, analyses and dumps, the analysis in progress |
/bench memory summary [live|all] [upload|share] | voxelbench.memory (+ the node of the verb) | Class histogram attributed per plugin, server and JDK, saved as JSON in the reports' memory/ folder. live (default) runs a full GC first; all does not and counts garbage too. The server freezes briefly (0.5 to 1 s per GB of heap in use with live in our tests, about half with all). With upload (alias send) or share, the summary is sent as soon as it is saved |
/bench memory list | voxelbench.memory | Saved summaries, marked when uploaded or shared (and dumps, with voxelbench.memory.dump) |
/bench memory show <number|id|last> [owner] | voxelbench.memory | Print a saved summary again; with a plugin name, its heaviest classes |
/bench memory delete <number|id|last> | voxelbench.memory | Delete a saved summary |
/bench memory dump [live|all] [gzip] [force] [analyze [quick|full|auto] [upload|share]] | voxelbench.memory + voxelbench.memory.dump (+ the node of the verb) | Preview a full heap dump: estimated freeze, watchdog limit, file size, free disk space, and what the file contains; with analyze, the memory the analysis may use; with upload or share, that the analysis will leave, never the dump. Nothing is written. Refused when the estimated freeze reaches the watchdog limit (settings.timeout-time of spigot.yml), unless force is added. upload/share without analyze is refused |
/bench memory dump [live|all] [gzip] [force] [analyze [quick|full|auto] [upload|share]] confirm | voxelbench.memory + voxelbench.memory.dump (+ the node of the verb) | Write the previewed dump (same sender, same options, within 60 s) to plugins/VoxelBench/heapdumps/. The whole server freezes meanwhile; the file contains everything in memory and never leaves the machine. With analyze, the dump is analysed right after, before any compression, and the analysis report is sent if a verb was given |
/bench memory dump list / dump delete <number|id|last> | voxelbench.memory + voxelbench.memory.dump | Heap dumps on disk; delete one |
/bench memory analyze [<number|id>|last] retained <plugin> [upload|share] | voxelbench.memory + voxelbench.memory.dump (+ the node of the verb) | Answer one question with far less memory than a full analysis: how much the named plugin retains — the objects reachable only through its own objects (its instances, its classes, its class loader) — with its heaviest classes. See What One Plugin Retains |
/bench memory analyze [<number|id>|last] [quick|full|auto] [upload|share] | voxelbench.memory + voxelbench.memory.dump (+ the node of the verb) | Analyse a dump on disk (the newest by default) in a separate, low-priority Java process: quick (own sizes per real class loader, Minecraft object counts, duplicate strings, sparse collections), full (retained sizes per plugin, leak suspects with their path from a GC root) or auto (default: full when the free memory and the container limit allow it, else quick). Refused when not even the quick one fits. The report, with no value from the heap, goes to the reports' memory/ folder; with upload or share, it is sent as soon as it is saved |
/bench memory analyze cancel | voxelbench.memory + voxelbench.memory.dump | Stop the analysis in progress (its process is killed, no report) |
/bench memory analyze list / show <number|id|last> / delete <number|id|last> | voxelbench.memory | Saved analyses, marked when uploaded or shared; print one again; delete one (the dump is not touched) |
/bench memory upload <id|#|last> [preview] | voxelbench.memory + voxelbench.memory.upload | Send that one heap summary or dump analysis to the voxelbench.com account of this (linked) server now; preview only shows what would leave, then confirm within 60 s sends exactly that. send is an alias. A heap dump is refused |
/bench memory share <id|#|last> [preview] | voxelbench.memory + voxelbench.memory.share | Publish a cleaned copy of that summary or analysis behind a public, unlisted link now (no account, expires after 7 days); preview only shows what would leave, then confirm within 60 s publishes exactly that. A heap dump is refused |
/bench memory unshare <id|#|last> | voxelbench.memory + voxelbench.memory.share | Delete a report's public link before it expires, even after the report was deleted here |
<id|#|last> names a summary or an analysis: its id, a unique prefix, last (the newest of both) or #N (rank among summaries and analyses together, newest first). See Memory Inspection for how to read a summary or an analysis, what a dump costs and how to open it, and what leaves when you send or share a report.
Forms for Commands Typed Without Options
Typed alone by a player, /bench profile, /bench memory summary, /bench memory dump and /bench memory analyze open a form with their options instead of running with the defaults: a native dialog on Paper 1.21.6 and later, an inventory screen elsewhere (click: next value, shift-click: previous). It offers the duration and sampling interval, live or all objects, gzip, the analysis mode, which dump to analyse, and whether to keep, share or upload the result — only what your permissions and config.yml allow.
The form only builds the command and runs it as if you had typed it: its permissions and refusals apply, and a dump still shows its preview and waits for its confirmation. The console, and any command typed with options, work as before (from the console, /bench profile alone still captures 30 s).
Each form reopens on your last choices (per player, kept across restarts in plugins/VoxelBench/form-choices.json): duration, interval, live or all objects, gzip, analysis mode, target plugin. A choice that is no longer offered (a permission removed, a setting changed) falls back to its default. Three choices always start from their default and are never carried over: keeping, sharing or uploading the result, forcing a dump past the watchdog, and which dump to analyse (the newest one).
Confirming a Preview
A heap dump, and upload/share … preview for profiles and memory reports, show a preview first and wait for confirm. There are three ways to give it, and all of them run that same … confirm command, with the same checks: same player or console, within 60 s, same options, file unchanged, permissions.
/bench confirm(or/b confirm) confirms the last preview of whoever types it — the console included — so/bench memory dump live gzip analyze full shareis followed by/bench confirminstead of the whole line again;- a click on the confirmation line in chat;
- for a player, Yes in the window that opens with the preview: a native dialog on Paper 1.21.6 and later, an inventory screen elsewhere. No (or Escape) does nothing.
confirmation.popup: falseinconfig.ymlturns the window off.
Report Commands
| Command | Permission | Description |
|---|---|---|
/bench reports | voxelbench.reports | Open the list of reports (player only; from the console, prints the usage) |
/bench reports list [type] [page] | voxelbench.reports | List saved reports; type is unit_test, benchmark, stresslimit or all |
/bench reports view <id> | voxelbench.reports | Show a report's details in chat |
/bench reports delete <id> | voxelbench.reports | Delete a report |
/bench reports cleanup | voxelbench.reports | Apply the retention rules now |
/bench reports gui [type] | voxelbench.reports | Open the list of reports filtered by type (player only) |
Server Verification Commands
| Command | Permission | Description |
|---|---|---|
/bench verify <CODE> | voxelbench.verify | Start server verification |
/bench verify status | voxelbench.verify | Check verification status |
/bench verify cancel | voxelbench.verify | Cancel ongoing verification |
Account Linking Commands
| Command | Permission | Description |
|---|---|---|
/bench link | voxelbench.link | Start the account linking process |
/bench link force | voxelbench.link | Re-link (replace existing token) |
Internal Commands
/bench autobot and /vbautobot are used only by the VoxelBench auto-bench agent. They do nothing unless the one-time code they carry is validated by the backend. You never need to type them.