Multi-layer Minecraft plugin & engine performance benchmark / regression harness (paper/folia/luminol). L0-L4 traceability: spark, JFR, async-profiler, bpftrace.
  • Python 64.1%
  • Shell 22.8%
  • Dockerfile 4.7%
  • JavaScript 4.2%
  • Jinja 3.4%
  • Other 0.8%
Find a file
exo 135486a069
All checks were successful
probe / it (push) Successful in 7s
test / unit (push) Successful in 33s
fix: pass PLUGBENCH_JVM_XMX/XMS through docker run -e to plugbench container
2026-05-06 18:03:46 +02:00
.forgejo/workflows ci(probe): retest volumes block with -c /data/config.yml flag now active 2026-05-06 00:12:43 +02:00
agent chunkstorm hardening: 2x mem_limit (was xmx*1.5), shorter radius (1000→500 blocks ≈ 12k→3k chunks), 5s settle pause; _publish_server_handle 30s retry tolerates compose ps empty-output (was IndexError-ing on transient mid-restart, killing whole repeat) 2026-05-06 13:23:45 +02:00
analyzer chunkstorm: capture chunk_gen_rate + drop unsupported chunky subcommands 2026-05-04 08:53:13 +02:00
control-group plugbench-ekaii: scaffold + Phase 0..4 implementation 2026-05-02 19:04:29 +02:00
docs gate: deploy automated regression-blocking on every plugin/engine repo 2026-05-05 22:36:51 +02:00
examples ci: switch runners off alpine (pyarrow wheels), use python:3.11-slim-bookworm 2026-05-02 19:17:04 +02:00
flavors flavors/folia: bump 1.21.4-build-50 → 1.21.11-build-6 (404 on PaperMC API) 2026-05-06 03:30:24 +02:00
orchestrator fix: gate reads bench.jvm.xmx from caller's .plugbench.toml 2026-05-06 17:19:37 +02:00
profilers runtime hardening: metrics poller, JFR ingest, graceful shutdown, bpftrace fix 2026-05-02 19:12:10 +02:00
schemas plugbench-ekaii: scaffold + Phase 0..4 implementation 2026-05-02 19:04:29 +02:00
scripts fix: pass PLUGBENCH_JVM_XMX/XMS through docker run -e to plugbench container 2026-05-06 18:03:46 +02:00
templates templates/engine: retry git clone too — github briefly 500'd on Hyacinthusclip 2026-05-06 12:20:56 +02:00
tests feat(correlate): ingest JFR events into events.parquet for L2 attribution 2026-05-04 08:45:02 +02:00
workflows ci: move reusable workflows out of .forgejo/, harden test workflow 2026-05-02 19:06:40 +02:00
.dockerignore ci(smoke): pre-create log dir + persist build-image.log on failure 2026-05-02 19:31:09 +02:00
.gitignore plugbench-ekaii: scaffold + Phase 0..4 implementation 2026-05-02 19:04:29 +02:00
AGENT_REPORT_CHUNKSTORM.md chunkstorm: align plugbench.toml + agent report 2026-05-04 08:57:50 +02:00
AGENT_REPORT_JFR.md gate: scripts/gate.sh + plugin & engine workflow templates + lint fix 2026-05-05 22:29:23 +02:00
CHANGELOG.md plugbench-ekaii: scaffold + Phase 0..4 implementation 2026-05-02 19:04:29 +02:00
Dockerfile fixes: bench short-circuit + 5 build-failure root causes 2026-05-06 01:57:53 +02:00
HANDOFF_NIGHT.md results: overnight bench — engine-diff + plugin-bench (idle, L2) 2026-05-04 05:52:56 +02:00
LICENSE plugbench-ekaii: scaffold + Phase 0..4 implementation 2026-05-02 19:04:29 +02:00
Makefile ci: scope test.yml to lint+unit only; drop CI smoke; document on-host smoke 2026-05-02 19:38:10 +02:00
plugbench.toml runner+toml: auto-resolve luminol server.jar via local_path_glob (image bakes none — plugin runs were silently using zombie containers from the shared external network) 2026-05-06 05:56:52 +02:00
pyproject.toml plugbench-ekaii: scaffold + Phase 0..4 implementation 2026-05-02 19:04:29 +02:00
README.md gate: deploy automated regression-blocking on every plugin/engine repo 2026-05-05 22:36:51 +02:00
RESULTS.md results: add chunkstorm under-load bench + iostorm cross-correlation 2026-05-04 10:12:32 +02:00

plugbench-ekaii

Multi-layer Minecraft plugin and engine performance benchmark and regression harness.

Given any plugin jar (or paper/folia/luminol server build), runs a fixed scenario in a controlled container, captures telemetry at 5 depths (server-internal → JVM → GC/heap → OS → kernel), and produces a diff vs (a) a no-plugin baseline and (b) the previous run of the same target. Every sample at every layer carries a (run_id, repeat, native_tid, ts_ns) key, so a tick-time spike can be traced down through the JVM thread → its native TID → the syscalls/IO it issued → the file descriptors and block devices it touched.

                              plugbench-ekaii
       ┌────────────────────────────────────────────────────────┐
       │  L0  spark            tick / TPS / MSPT / per-plugin   │
       │  L1  async-profiler   CPU + alloc + wall + lock        │
       │  L2  JFR              GC + locks + IO + heap-after-GC  │
       │  L3  /proc + perf     per-thread CPU, ctx-sw, faults   │
       │  L4  bpftrace         syscalls, IO lat, scheduler      │
       └────────────────────────────────────────────────────────┘
                              join key: native_tid + ts_ns

See docs/ for architecture, cross-layer tracing, scenarios, engine-bench mode, and the automatic regression-blocking gate (docs/gating.md) deployed across all jar-producing exo/* repos.

Quick start

# from any plugin repo on a `bench`-labelled forgejo runner
plugbench run \
  --jar build/libs/MyPlugin.jar \
  --flavor folia \
  --scenario chunkstorm,redstone,entity \
  --depth L4 \
  --repeats 5

Modes

  • Plugin bench--jar <plugin.jar> against a fixed engine version.
  • Engine bench--engine paper:1.21.4-build123 vs paper:1.21.4-build140 (or any flavor:version pair, including local luminol-ekaii builds). Same scenarios; diff is attributed to engine code.

License

MIT (see LICENSE).