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 gui and 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 reports and /bench reports gui, /bench lang auto, /bench monitor gui and /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

CommandPermissionDescription
/bench help (alias ?)voxelbench.useList all commands
/bench guivoxelbench.guiOpen the main GUI (player only)
/bench statusvoxelbench.useShow the operating mode, plugin version, running test, rate-limit cooldown and last score
/bench version (aliases ver, v)voxelbench.useShow the plugin version
/bench info [topic]voxelbench.infoShow system information. Without a topic, shows everything. Topics: cpu, ram, disk, network, server, java, system, hosting, performance, plugins, worlds, sensors, auth, bench, build
/bench tpsvoxelbench.useCompare the TPS reported by the server with VoxelBench's own measurement
/bench msptvoxelbench.useSame comparison for MSPT
/bench lang [code|auto]voxelbench.langShow 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 reloadvoxelbench.reloadReload config.yml
/bench pingvoxelbench.useTest the connection to the VoxelBench backend (DNS, then TCP/TLS/HTTP) to diagnose submission failures
/bench confirmvoxelbench.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

CommandPermissionDescription
/bench start [force] [warmup] [runs]voxelbench.start (force: also voxelbench.start.force)Run the full benchmark (player only)
/bench stop (alias cancel)voxelbench.stopStop the running benchmark, test or stress run, including a multi-run session waiting for its next iteration
/bench zonesvoxelbench.useList the test zones of the last run, in the world it used
/bench zones tp <number>voxelbench.worldTeleport to a test zone (0 = default zone; player only)
/bench zones clean <number|all>voxelbench.worldRemove entities and dropped items left around a test zone, in a voxelbench_* world only
/bench world ...voxelbench.worldManage 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 tier and /bench custom run removed villagers, animals (tamed and named ones included), golems, dropped items, minecarts and boats from every loaded world as the run started; /bench stop removed villagers, cats, golems and dropped items around fixed spots of the test's world, whatever it was; and without a pinned world, /bench zones clean swept 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:

ArgumentEffect
forceIgnore the local rate-limit cooldown (requires voxelbench.start.force)
warmupRun 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

CommandDescription
/bench world listList 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 showShow the pinned benchmark world
/bench world set <name>Pin a loaded world for every benchmark, test and stress run
/bench world unsetRemove 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

CommandPermissionDescription
/bench test (alias tests)voxelbench.useList 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

TestConsolePermission
diskYesvoxelbench.test.disk
networkNovoxelbench.test.network
memoryYesvoxelbench.test.memory
multiCoreYesvoxelbench.test.multicore

Single-Core CPU

TestConsolePermission
singleCoreBenchmarkYesvoxelbench.test.singlecorebenchmark
singleCoreMaxYesvoxelbench.test.singlecoremax

Gameplay

TestConsolePermission
chunkLoadingYesvoxelbench.test.chunkloading
mobSpawnNovoxelbench.test.mobspawn
hopperYesvoxelbench.test.hopper
explosionYesvoxelbench.test.explosion
lightingUpdate (alias lighting)Yesvoxelbench.test.lighting
worldSaveYesvoxelbench.test.worldsave
redstoneYesvoxelbench.test.redstone
blockPhysicsYesvoxelbench.test.blockphysics
chunkTickingYesvoxelbench.test.chunkticking
entityCollision (alias collision)Novoxelbench.test.collision
tickingTileEntity (alias tileentity)Yesvoxelbench.test.tileentity
mobAINovoxelbench.test.mobai
mobPathfindingNovoxelbench.test.mobpathfinding
villagerTrading (alias villager)Novoxelbench.test.villager
boneMealGrowthYesvoxelbench.test.bonemealgrowth
liquidPhysicsNovoxelbench.test.liquidphysics
combatSimulationNovoxelbench.test.combatsimulation
projectileStormYesvoxelbench.test.projectilestorm
entityCrammingYesvoxelbench.test.entitycramming
playerWorldLoadYesvoxelbench.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:

CommandNotes
/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

CommandPermissionDescription
/bench stresslimit [force]voxelbench.stresslimitRun 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.tierRun 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

CommandPermissionDescription
/bench custom list (alias ls)voxelbench.custom or voxelbench.startList the loaded profiles, tagged [STD] (benchmark) or [STRESS] (stress limit)
/bench custom info <name> (alias show)voxelbench.custom or voxelbench.startShow a profile's metadata and steps
/bench custom run <name> [force]voxelbench.custom or voxelbench.start; a stress limit profile also needs voxelbench.stresslimitRun a profile (player only, requires a linked server)
/bench custom reloadvoxelbench.custom or voxelbench.start, and voxelbench.reloadRe-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

CommandPermissionDescription
/bench monitorAny of voxelbench.monitor, voxelbench.monitor.bars, voxelbench.monitor.webOpen the boss bar monitoring GUI (players with voxelbench.monitor.bars) or show the status
/bench monitor statusAny of voxelbench.monitor, voxelbench.monitor.bars, voxelbench.monitor.webShow the status of boss bars, web server, push mode and remote monitoring
/bench monitor reloadvoxelbench.monitorReload 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.barsToggle 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.webStart, 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.webEnable or disable the HTML dashboard (API-only when off)
/bench monitor push [start|stop|test|status]voxelbench.monitor.webControl push mode; test sends one request to check the settings
/bench monitor remote [on|off|status]voxelbench.monitor.webSend 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 authvoxelbench.monitor.webShow the dashboard authentication status
/bench monitor auth password <password>voxelbench.monitor.webSet the dashboard password (12+ characters, stored as a PBKDF2 hash) and enable authentication. Server console only
/bench monitor auth username <name>voxelbench.monitor.webSet the dashboard username
/bench monitor auth key <pull|push>voxelbench.monitor.webGenerate an API key for reading /api/metrics (pull) or for push mode (push)
/bench monitor whitelist [on|off|list]voxelbench.monitor.webShow, enable, disable or list the IP whitelist
/bench monitor whitelist add <ip>voxelbench.monitor.webAdd an IP to the whitelist
/bench monitor whitelist remove <ip>voxelbench.monitor.webRemove an IP from the whitelist
/bench monitor whitelist mode <all|dashboard|api>voxelbench.monitor.webChoose what the whitelist protects
/bench monitor https [on|off|status]voxelbench.monitor.webEnable, disable or check HTTPS
/bench monitor https generate [days]voxelbench.monitor.webGenerate a self-signed certificate (365 days by default)
/bench monitor https password <password>voxelbench.monitor.webSet 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.

CommandPermissionDescription
/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 listvoxelbench.profileSaved profiles, newest first
/bench profile show <number|id|last>voxelbench.profilePrint a saved profile's summary again
/bench profile delete <number|id|last>voxelbench.profileDelete a saved profile
/bench profile upload <number|id|last> [preview]voxelbench.profile + voxelbench.profile.uploadSend 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.sharePublish 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.shareDelete a profile's public link before it expires
/bench profile statusvoxelbench.profileJFR 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.

CommandPermissionDescription
/bench memory [status]voxelbench.memoryHeap 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 listvoxelbench.memorySaved summaries, marked when uploaded or shared (and dumps, with voxelbench.memory.dump)
/bench memory show <number|id|last> [owner]voxelbench.memoryPrint a saved summary again; with a plugin name, its heaviest classes
/bench memory delete <number|id|last>voxelbench.memoryDelete 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]] confirmvoxelbench.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.dumpHeap 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 cancelvoxelbench.memory + voxelbench.memory.dumpStop the analysis in progress (its process is killed, no report)
/bench memory analyze list / show <number|id|last> / delete <number|id|last>voxelbench.memorySaved 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.uploadSend 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.sharePublish 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.shareDelete 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 share is followed by /bench confirm instead 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: false in config.yml turns the window off.

Report Commands

CommandPermissionDescription
/bench reportsvoxelbench.reportsOpen the list of reports (player only; from the console, prints the usage)
/bench reports list [type] [page]voxelbench.reportsList saved reports; type is unit_test, benchmark, stresslimit or all
/bench reports view <id>voxelbench.reportsShow a report's details in chat
/bench reports delete <id>voxelbench.reportsDelete a report
/bench reports cleanupvoxelbench.reportsApply the retention rules now
/bench reports gui [type]voxelbench.reportsOpen the list of reports filtered by type (player only)

Server Verification Commands

CommandPermissionDescription
/bench verify <CODE>voxelbench.verifyStart server verification
/bench verify statusvoxelbench.verifyCheck verification status
/bench verify cancelvoxelbench.verifyCancel ongoing verification

Account Linking Commands

CommandPermissionDescription
/bench linkvoxelbench.linkStart the account linking process
/bench link forcevoxelbench.linkRe-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.