Stress Limit Mode
Stress Limit mode finds your server's breaking point: it raises the load of a workload tier by tier until the server can no longer keep up, then narrows down the exact limit.
What is Stress Limit?
A standard benchmark measures how your server performs under a fixed load. Stress Limit answers a different question: how much of a given workload can this server sustain? The result is a number per workload, for example "the server held 2,400 hopper lines before breaking".
How to Use
Full Stress Limit Run
/bench stresslimit
- Must be run in-game by a connected player.
- The first call displays a summary (server type, benchmark world check, load range of each stress type, TPS threshold). Type the command again within 10 seconds to start.
- Runs every stress type in sequence, each one in freshly generated test zones, with a short pause between types.
- Uses the same cooldown as
/bench start;/bench stresslimit forcebypasses it (requiresvoxelbench.start.force). - The results are saved locally and submitted to voxelbench.com.
/bench stopaborts the run; nothing is submitted.
You can also start it from the GUI: /bench gui, then the Stress Limit tab, which also lists past stress reports.
Single Type: /bench tier
/bench tier <type> [options]
Runs the tier ladder on one stress type only, which is much faster when you are tuning or diagnosing one workload. Unlike /bench stresslimit, it asks for no confirmation and ignores the cooldown. It needs a connected player and the voxelbench.tier permission.
| Option | Effect |
|---|---|
from=<load> | Starting load (default: the type's starting load) |
to=<load> | Ceiling load (default: the type's nominal ceiling) |
tiers=<1-40> | Stop after this many tiers |
duration=<3-120> | Seconds per tier |
zones=<1-8> | Number of test zones |
cold | Ignore the warm start and climb from the starting load |
noskip | Disable early tier skipping, so every tier is measured over its full duration |
Examples:
/bench tier tnt tiers=3 cold noskip
/bench tier hoppers from=100 to=2000 duration=12 zones=2
A tier run is saved as a local stress report but is never submitted as a full stress limit result. When unit-test sync is enabled (reports.backend.unit-tests: true) and the server is linked, it is sent on the unit-test channel instead. It does not update the warm-start memory.
Stress Types
| Type | What Increases | Starting Load | Nominal Ceiling |
|---|---|---|---|
mobs | Mobs | 400 | 15,000 |
chunks | Chunk generation rate | 8 | 2,000 |
hoppers | Hopper lines | 5 | 8,000 |
tnt | TNT charges | 40 | 5,000 |
redstone | Redstone circuits | 100 | 5,000 |
entities | Objects (two thirds dropped items, one third mobs) | 1,000 | 80,000 |
villagers | Villagers | 50 | 5,000 |
/bench tier also accepts common spellings such as mob, explosion, collision or villager.
The nominal ceiling is soft: if the server still has plenty of headroom when it reaches it, the ceiling is doubled, up to a hard cap of five times the nominal value. That hard cap cannot be raised, even by a custom profile.
How It Works
- Tiers: each tier runs the workload at a given load, 10 seconds by default, with a 1-second pause and a zone cleanup before the next one. A tier can end early when the server is clearly comfortable (TPS of at least 19.5 and MSPT of at most 15 ms by default, once the load is fully established); some workloads never skip.
- Verdict: a tier breaks when the server no longer keeps up, mainly when average TPS drops below 18 or average MSPT rises above 55 ms. Additional signals can break a tier: on Folia, the tick rate and overload of the region running the test; the share of the requested load the server actually managed to process; and a combined health score. A tier with no usable measurement is never counted as stable.
- Adaptive ramp: after a stable tier, the next load is the current one multiplied by a factor that depends on the remaining headroom: about ร2.5 when the server is idle, down to ร1.15 near the breaking point. After three nearly idle tiers in a row, each further one multiplies the step by 1.5, cumulatively;
ramp.plateauBoost: falseturns this off. - Break confirmation: the first time a load breaks, the same load is measured again. Only a second failure is accepted as a break.
- Refinement: VoxelBench then runs a binary search between the last stable load and the broken one, until the gap is about 250 units or after 8 attempts at most. The last stable load found is the result.
- End: a type also ends when the hard cap is reached while still stable, or after 10 minutes.
Warm Start
After each full run, the last stable load of every type is stored in plugins/VoxelBench/stress-warmstart.yml. The next run starts at 70% of that value instead of the starting load, which skips many easy tiers. If that first tier breaks, VoxelBench searches downwards (up to 6 steps); if nothing holds, it restarts cleanly from the starting load. Stored values older than 30 days, or at or above the current ceiling, are ignored.
The behavior is configured in config.yml:
stress-limit:
warm-start:
enabled: true # false = always climb from the starting load
factor: 0.70 # start at 70% of the last stable value
max-refine-down-steps: 6 # binary steps when the warm probe breaks
max-age-days: 30 # ignore remembered values older than this
Custom Stress Profiles
A custom stress profile is a YAML file in plugins/VoxelBench/custom_benchmarks/ with kind: stresslimit. It chooses which stress types to run and can change their bounds, the break thresholds and how the ramp behaves. Three examples are bundled: stress-redstone.yml, stress-monster.yml and stress-freehost.yml.
kind: stresslimit
name: "Redstone Torture"
description: "Pushes only redstone, fine ramp, high precision at the breaking point."
version: 1
submit: false # false (default) = results stay local
stress:
types: # which types to run, with optional bounds
- id: redstone
base: 400 # starting load
max: 8000 # soft ceiling (the hard cap still applies)
thresholds: # when a tier breaks
tpsBreak: 18.0
msptBreak: 55.0
ramp: # how fast to climb
stepMin: 1.12 # multiplier near the breaking point
stepMax: 1.8 # multiplier when the server is idle
curve: 2.0
plateauBoost: true # larger steps after several nearly idle tiers (false: off)
refine: # binary search at the breaking point
targetPrecision: 100
maxIterations: 8
timing:
palierDurationSec: 10 # seconds per tier
maxDurationMinutes: 10 # time limit per type
earlySkip: true
zones: 4
Every setting is optional except stress.types; missing values keep the defaults described above. An unknown type rejects the profile.
Run it like any custom profile:
/bench custom list
/bench custom info stress-redstone
/bench custom run stress-redstone
The same rules as other custom profiles apply: in-game only, linked server required, shared cooldown, a single iteration. Running one also needs voxelbench.stresslimit, like /bench stresslimit. With submit: true the report is sent to voxelbench.com at the end of the run. There, it belongs to the account the server is linked to and is private at first: you can share it by link (unlisted), never make it public. It gets no score and no rank and appears on no leaderboard, since its thresholds and ramp are the profile author's (see Custom Profiles).
Understanding Results
At the end of each type, the chat shows the highest stable load and the TPS measured at that load, and whether the server actually broke or stayed stable up to the ceiling. Hover over a tier line for its detailed metrics. The full ladder, tier by tier, is kept in the local report (/bench reports, Stress Limit filter) and in the online report.
- High limit: your server has headroom for that workload
- Low limit: that workload is a bottleneck worth optimizing
- Stable up to the ceiling: the server did not break within the tested range
Tips
- Run stress tests when the server is idle and in a dedicated flat world (
/bench world create, then/bench world set) - Results depend on your server software, configuration and installed plugins
- Use
/bench tier <type> coldto re-measure one workload from scratch after a change - Compare results before and after server optimizations to measure the improvement
Permissions
Requires voxelbench.stresslimit permission (default: OP). /bench tier checks voxelbench.tier. A custom stress profile needs voxelbench.stresslimit on top of voxelbench.custom (or voxelbench.start); without it, stress profiles are not offered by the tab completion of /bench custom run or by the custom profiles screen.