Commit Graph
25 Commits
Author SHA1 Message Date
pyranotaandClaude Opus 4.7 74b662d8de feat(benchmarks): k8s sim mode + util-group dashboard + reliability fixes
Stand up a minikube-backed simulation subsystem for benching Windmill under
realistic multi-node load, with a per-bench measurement pipeline and a
dashboard renderer that consolidates throughput, queue depth, per-node CPU,
PG latency/conns, OOM events, and per-node CPU-util-vs-oversaturation into
one SVG report.

Sim infrastructure (sim/):
- k8s_provisioner: minikube up + heterogeneous node sizing from topology JSON
- helm_deploy: helm install Windmill with smoke.yaml + local.yaml overlays
- image_cache: pre-load required images so bench bringup is offline-safe
- toxiproxy_k8s: per-node toxiproxy DaemonSet for cross-node latency injection
- cpu_sampler_k8s: privileged DS reading per-cgroup cpu.stat at 10Hz, dual-
  writes to stdout AND a host-mounted log file (/var/log/wm-sim-cpu-sampler/
  sampler.tsv) so heavy benches no longer lose early samples to kubelet log
  rotation
- pg_logging: ALTER SYSTEM + SIGHUP to enable verbose PG logging without restart
- pgbadger: post-bench PG log analysis HTML report
- readiness: pre-bench cluster health check (samplers stable ≥30s, workers
  ready, PG responsive, queue empty, **deploy.status rollout-complete**) —
  the rollout-complete check catches mid-rolling-update fires that previously
  starved m04's sampler under cgroup_mutex contention

Per-bench JSONL pollers, started/finalized alongside the bench loop:
- pod_timeline: 1Hz workers-per-node Ready counts (used for the workers panel)
- oom_poller: live OOM event capture (kernel + kubelet evictions + cgroup)
- pg_latency_poller: 4Hz psql \\timing on SELECT 1 vs kubectl-exec roundtrip
- pg_conn_poller: 1Hz pg_stat_activity by state (active/idle/idle_in_xact)
- node_load_poller: 2Hz /proc/loadavg + /proc/stat procs_running per node

Dashboard renderer (sim/render_report.ts + graph.ts):
- Util group: one panel per node with translucent orange oversaturation area
  BEHIND solid blue CPU-util area, 100% reference line, phase-boundary verticals.
  cols:2 grid wraps after 2 panels per row.
- PG node tinted with [PG] flag in legend across the dashboard.
- Phase-boundary verticals + push-window shaded zones layered consistently.
- All x-axes switched from wall-clock HH:MM to relative seconds-from-bench-
  start. Shared origin sourced from meta.json's bench_start_ms so 0s on every
  panel = the same wall-clock moment (previously each chart picked its own
  earliest sample as origin, causing drift between panels).

Oversaturation metric, with explicit fallback:
- Primary: (procs_running - ncpu) / ncpu × 100 — true CPU run-queue pressure.
- Fallback to load1 when procs_running is missing (older reports).
- load1 overcounted previously because it includes uninterruptible D-state
  procs (PG backends in disk I/O, cgroup_mutex waits), inflating "saturation"
  by 5-10x under load.
- Pure helper extracted to sim/util_metrics.ts; 8 unit tests cover the
  procs_running > load1 preference, the clamp-at-zero, invalid-ncpu cases.

Sampler reliability:
- HostPath log file in addition to stdout so the bench's scp-based collector
  bypasses kubelet log rotation entirely.
- main.ts truncates the host log file on every node before pushers start
  (parallel ssh, best-effort) so it doesn't grow unbounded across runs.
- Collector falls back to kubectl-logs when scp fails for any node.

Workloads (workloads/):
- io_4phase: four-phase IO step (idle → 2.5s → 500ms → 150ms jobs)
- io_150ms_flood / io_300ms_flood / io_1s_flood / io_2s_flood: single-phase
  flood configs to isolate the worker-host CFS context-switch storm vs PG
  contention regime
- burst, ops_day, cpu_*, etc. for other scenarios

Tests:
- sim/util_metrics_test.ts — 8 cases for computeOversatPct
- sim/util_panel_snapshot_test.ts — 5 assertions guarding util-panel SVG
  invariants (orange behind blue, 100% ref line, relative-time ticks NOT
  wall-clock, phase-boundary verticals, shared-origin override)

Helm values:
- sim/values/smoke.yaml — bench-tuned: workers w/ no CPU limit & low mem
  request, PG w/ 3-core request + wm-critical priorityClass + oomImmune +
  maxConnections, app w/ wm-critical + oomImmune + no resource limits.
- sim/values/local.example.yaml — template for the gitignored local.yaml
  that carries the EE license key.
- Depends on the wm-critical PriorityClass + oomImmune + maxConnections
  knobs landing in windmill-helm-charts (separate PR).

graph.ts additions:
- areaFills param: ordered list of per-kind translucent area fills drawn
  before lines, used by the util panel for orange-behind-blue layering
- lineColorOverrides: pin per-kind line colors so oversaturation reliably
  renders orange regardless of d3 ordinal-color insertion order
- highlightKindToken: substring-match flag for the PG-node tint in Node CPU
- xRelativeOriginMs: shared bench-start origin for the relative-time x-axis
- DataPointMulti is now exported for downstream tests

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-08 11:43:47 +02:00
Ruben FiszelandClaude Opus 4.6 9e235937ce add WAC v2 benchmarks and improve benchmark infrastructure (#8550)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 08:53:46 +00:00
HugoCasa 323900e214 feat: dedicated benchmarks (#2297)
* feat: dedicated benchmarks

* feat: dedicated benchmarks

* fix: build

* fix: use ee for ci

* fix: ci

* fix: handle create jobs error

* fix: nits
2023-09-19 14:03:19 +02:00
HugoCasa fc92d8049f feat: benchmarks graph (#2244)
* feat: benchmarks graph

* feat: benchmarks graph gh action

* fix: gh action for testing

* fix: gh action

* Update benchmark.yml

* Update benchmark.yml

* Update benchmark.yml

* feat: deployed scripts + more langs

* fix: gh action regex

* fix: increase time

* fix: title + logs
2023-09-07 15:45:08 +02:00
Ruben Fiszel 5ac99b817e feat: dedicated workers for native-throughput performance (EE only) (#2239)
* dedicated worker

* dedicated worker

* merge

* progress

* progress

* progress

* merge

* update

* sqlx

* fix imports
2023-09-06 10:32:53 +02:00
Ruben Fiszel 2ee54c8dd5 fix benchmark tool 2023-08-18 15:44:32 +02:00
Ruben Fiszel 0f48c19d5a fix: respect FIFO order for concurrency limit 2023-07-24 18:11:23 +02:00
Guillaume Bouvignies 7f3c7ea9d1 Specific NOOP jobs benchmark (#1810)
* Refactor and fix NOOP benchmark

* Add endpoint to toggle workers on/off when compiled in benchmark mode

* Improve noop benchmark
2023-07-10 14:16:34 +02:00
Ruben Fiszel 663e2148ac feat: smtp support to invite users (#1777)
* email support

* everyhting

* smtp

* update

* update

* update

* setup backend test
2023-06-29 10:34:44 +02:00
Ruben Fiszel 01a5ae940f add proto postgresql backend support as a job language 2023-06-26 18:23:14 +02:00
Ruben Fiszel 8e59cd760a implement native http handler as a tokio spawn 2023-06-26 11:07:42 +02:00
Ruben Fiszel 419dfd0ab8 improve support for native http handling 2023-06-25 20:07:53 +02:00
Ruben Fiszel 55734466dc improve support for native http handling 2023-06-25 20:00:27 +02:00
Ruben Fiszel 6ddc434357 feat: cancel non-yet-running jobs and rework force cancellation 2023-06-25 18:02:00 +02:00
Ruben Fiszel 524fe88205 feat: release wmillbench publicly 2023-06-23 15:08:33 +02:00
Ruben Fiszel 1e68dc32ed update benchmarks 2023-06-23 14:28:19 +02:00
Kai JellinghausandRuben Fiszel 63102b036c feat(backend): Redis based queue (#1324)
* Merge?

* Fix V8 breaking change

* WIP

* WIP

* Cleanup

* Move to git reference

* Fix Merge conflict

* update

---------

Co-authored-by: Ruben Fiszel <ruben@rubenfiszel.com>
2023-04-11 12:24:13 +02:00
Kai JellinghausandRuben Fiszel 042d10b6aa Allow complex action setups in benches (#869)
Co-authored-by: Ruben Fiszel <ruben@rubenfiszel.com>
2022-11-07 15:38:28 +01:00
Kai Jellinghaus 9ab54b440a Bench improvements (#774)
* Fix trailing / in host URL

* Allow continous run with throughput

* Fix whitespace
2022-10-20 07:41:33 +02:00
Ruben Fiszel e67a49d9fb nits 2022-10-19 03:41:56 +02:00
Ruben Fiszel d1657383c7 feat(backend): atomic moving queue -> complete and delete (#771)
* feat(backend): atomic move to queue + delete

* fix

* fix

* fix

* fix
2022-10-19 03:16:15 +02:00
Ruben Fiszel 5c5c9fbd78 migrating benchmark to deno client 1.38.5 2022-10-18 23:16:58 +02:00
Ruben Fiszel b9ce158357 fix benchmarks 2022-10-18 21:19:37 +02:00
Ruben Fiszel c5e6607e5f little benchmark console feedback 2022-10-18 20:42:16 +02:00
Kai Jellinghaus 43e6f5c525 feat(benchmark): Initial Benchmarking Tool (#731)
* Deno setup

* Very basic benchmarking

* Collect metrics into CSV

* Rip out CSV functionality

* export to influxdb

* remove old files

* Move into subfolder in preparation for merge

* Move settings to correct folder

* Cleanup & Fix typing

* Remove unused code

* Add JSON export of specific metrics

* Wait for all jobs to complete & check resutls

* Delete output.json

* Apply some review comments

* Simplify some truthy expressions

* Remove InfluxDB

* Rewrite Stats calculation

* Add CSV output

* Fix stdev calculations

* Add README

* Add maximum-throughput option

* Add flow option

* Remove testing changes

* Revert auto-format

* Track zombie workers
2022-10-18 14:10:04 +02:00