Skip to content

ring: add Clojure framework - #1092

Merged
MDA2AV merged 2 commits into
MDA2AV:mainfrom
Ramblurr:pr/clojure-ring
Aug 8, 2026
Merged

ring: add Clojure framework#1092
MDA2AV merged 2 commits into
MDA2AV:mainfrom
Ramblurr:pr/clojure-ring

Conversation

@Ramblurr

@Ramblurr Ramblurr commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Description

Adds the Ring Clojure framework.


PR Commands — comment on this PR to trigger (requires collaborator approval):

Command Description
/benchmark -f <framework> Run every test the framework subscribes to
/benchmark -f <framework> -t <test> Run one test only
/benchmark -f <framework> --save Run and save results (updates the leaderboard on merge)
/benchmark -f <framework> -t <test> --save Run one test and save results
/benchmark -f <framework> --compare <other> Measure the deltas against another framework instead of this one
/benchmark-multiple -f <fw1>,<fw2>,... Benchmark several frameworks in one run — takes -t and --save too; saved results land in a single commit
/benchmark-multiple --save No -f needed: benchmark and save every framework the PR touches
/benchmark-test -t <test> Benchmark all enabled frameworks subscribed to <test> and save the results

For /benchmark, always specify -f <framework>; the flags combine in any order. Results come back as a comment with a per-profile table of RPS, p99, CPU and memory — one table per framework on multi runs. A new benchmark comment while a run is in flight queues behind it (one deep) instead of cancelling it. For multi-framework PRs (dependency bumps, same-language refactors) prefer /benchmark-multiple, which runs everything in a single job and commits all saved results together, so no run overwrites another. --compare works on single-framework runs only.

What the deltas are measured against. By default, this framework's own results published on main - answering "did this change help?". When you are tuning a variant or a successor entry, --compare re-bases them on another entry instead:

/benchmark -f genhttp-11 --compare genhttp

The reply states which baseline it used, and profiles the other framework does not run show n/a rather than a delta.


Run benchmarks locally

You can validate and benchmark your framework locally with the lite script — no CPU pinning, fixed connection counts, all load generators run in Docker.

./scripts/validate.sh <framework>
./scripts/benchmark-lite.sh <framework> baseline
./scripts/benchmark-lite.sh --load-threads 4 <framework>

Requirements: Docker Engine on Linux. Load generators (gcannon, h2load, h2load-h3, wrk, ghz) are built as self-contained Docker images on first run.

@MDA2AV

MDA2AV commented Aug 8, 2026

Copy link
Copy Markdown
Owner

/benchmark -f ring --save

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

👋 Benchmark request received. A collaborator will review and approve the run.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: ring | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 882,969 6440.0% 5.3GiB ~0% ~0%
baseline 4096 882,349 6237.2% 8.2GiB ~0% ~0%
pipelined 512 1,724,954 6415.9% 3.5GiB ~0% ~0%
pipelined 4096 1,753,370 6404.7% 6.2GiB ~0% ~0%
limited-conn 512 519,223 5422.3% 4.8GiB ~0% ~0%
limited-conn 4096 548,206 5533.0% 6.3GiB ~0% ~0%
json 4096 83,732 6331.4% 4.7GiB ~0% ~0%
json-comp 512 45,410 6405.4% 3.4GiB ~0% ~0%
json-comp 4096 45,606 6428.2% 5.7GiB ~0% ~0%
json-comp 16384 47,179 6221.1% 6.9GiB ~0% ~0%
upload 32 2,606 2491.3% 1.0GiB ~0% ~0%
upload 256 2,812 4430.7% 1.1GiB ~0% ~0%
static 1024 187,672 6530.8% 1.9GiB ~0% ~0%
static 4096 186,734 6430.8% 3.0GiB ~0% ~0%
static 6800 184,285 6443.7% 3.7GiB ~0% ~0%
async-db 1024 57,646 6488.3% 4.9GiB ~0% ~0%
Full log
Running 5s test @ http://localhost:8080
  64 threads and 4096 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   100.38ms  238.02ms   2.00s    88.20%
    Req/Sec     3.07k     2.14k   15.78k    71.47%
  816380 requests in 5.10s, 48.48GB read
  Socket errors: connect 0, read 0, write 0, timeout 75
Requests/sec: 160039.83
Transfer/sec:      9.50GB
[info] CPU 6352.1% | Mem 2.3GiB

[run 2/3]
Running 5s test @ http://localhost:8080
  64 threads and 4096 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   169.22ms  357.73ms   2.00s    86.24%
    Req/Sec     3.01k     2.24k   18.08k    75.10%
  943435 requests in 5.10s, 56.02GB read
  Socket errors: connect 0, read 0, write 0, timeout 181
Requests/sec: 184993.06
Transfer/sec:     10.99GB
[info] CPU 6456.7% | Mem 3.0GiB

[run 3/3]
Running 5s test @ http://localhost:8080
  64 threads and 4096 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   133.78ms  265.86ms   1.98s    85.39%
    Req/Sec     3.27k     2.16k   20.08k    69.37%
  952212 requests in 5.10s, 56.54GB read
  Socket errors: connect 0, read 0, write 0, timeout 120
Requests/sec: 186734.96
Transfer/sec:     11.09GB
[info] CPU 6430.8% | Mem 3.0GiB

=== Best: 186734 req/s (CPU: 6430.8%, Mem: 3.0GiB) ===
[info] saved results/static/4096/ring.json
httparena-bench-ring
httparena-bench-ring

==============================================
=== ring / static / 6800c (tool=wrk) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
Running 5s test @ http://localhost:8080
  64 threads and 6800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    98.50ms  288.42ms   2.00s    91.50%
    Req/Sec     2.66k     1.89k   13.92k    71.77%
  787796 requests in 5.10s, 46.78GB read
  Socket errors: connect 0, read 0, write 0, timeout 560
Requests/sec: 154475.32
Transfer/sec:      9.17GB
[info] CPU 6336.6% | Mem 2.6GiB

[run 2/3]
Running 5s test @ http://localhost:8080
  64 threads and 6800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   169.70ms  362.51ms   1.99s    86.05%
    Req/Sec     2.94k     1.87k   16.50k    75.74%
  935525 requests in 5.10s, 55.56GB read
  Socket errors: connect 0, read 0, write 0, timeout 75
Requests/sec: 183418.65
Transfer/sec:     10.89GB
[info] CPU 6472.1% | Mem 3.1GiB

[run 3/3]
Running 5s test @ http://localhost:8080
  64 threads and 6800 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   113.84ms  296.92ms   2.00s    89.02%
    Req/Sec     3.02k     1.98k   17.36k    71.33%
  939774 requests in 5.10s, 55.80GB read
  Socket errors: connect 0, read 0, write 0, timeout 811
Requests/sec: 184285.46
Transfer/sec:     10.94GB
[info] CPU 6443.7% | Mem 3.7GiB

=== Best: 184285 req/s (CPU: 6443.7%, Mem: 3.7GiB) ===
[info] saved results/static/6800/ring.json
httparena-bench-ring
httparena-bench-ring
[info] skip: ring does not subscribe to static-tls

==============================================
=== ring / async-db / 1024c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   16.78ms   7.13ms   36.00ms   128.10ms   293.60ms

  537014 requests in 10.00s, 536243 responses
  Throughput: 53.61K req/s
  Bandwidth:  206.87MB/s
  Status codes: 2xx=536243, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 536243 / 536243 responses (100.0%)
  Latency overflow (>5s): 60
  Reconnects: 20978
  Per-template: 106588,107541,107863,107435,106816
  Per-template-ok: 106588,107541,107863,107435,106816
[info] CPU 5993.1% | Mem 4.8GiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   16.38ms   10.50ms   32.70ms   97.40ms   203.70ms

  576671 requests in 10.00s, 576085 responses
  Throughput: 57.59K req/s
  Bandwidth:  222.61MB/s
  Status codes: 2xx=576085, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 576084 / 576085 responses (100.0%)
  Reconnects: 22715
  Per-template: 114494,114980,115666,115774,115170
  Per-template-ok: 114494,114980,115666,115774,115170
[info] CPU 6389.1% | Mem 4.9GiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   16.20ms   10.20ms   31.10ms   90.20ms   204.60ms

  577096 requests in 10.00s, 576463 responses
  Throughput: 57.63K req/s
  Bandwidth:  222.58MB/s
  Status codes: 2xx=576463, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 576460 / 576463 responses (100.0%)
  Reconnects: 22696
  Per-template: 114897,115167,115553,115681,115162
  Per-template-ok: 114897,115167,115553,115681,115162
[info] CPU 6488.3% | Mem 4.9GiB

=== Best: 57646 req/s (CPU: 6488.3%, Mem: 4.9GiB) ===
[info] input BW: 3.85MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/ring.json
httparena-bench-ring
httparena-bench-ring
[info] skip: ring does not subscribe to crud
[info] skip: ring does not subscribe to fortunes
[info] skip: ring does not subscribe to baseline-h2
[info] skip: ring does not subscribe to static-h2
[info] skip: ring does not subscribe to baseline-h2c
[info] skip: ring does not subscribe to json-h2c
[info] skip: ring does not subscribe to baseline-h3
[info] skip: ring does not subscribe to static-h3
[info] skip: ring does not subscribe to gateway-64
[info] skip: ring does not subscribe to gateway-h3
[info] skip: ring does not subscribe to production-stack
[info] skip: ring does not subscribe to unary-grpc
[info] skip: ring does not subscribe to unary-grpc-tls
[info] skip: ring does not subscribe to stream-grpc
[info] skip: ring does not subscribe to stream-grpc-tls
[info] skip: ring does not subscribe to echo-ws
[info] skip: ring does not subscribe to echo-ws-pipeline
[info] skip: ring does not subscribe to echo-ws-limited
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/ring.json - 16 new, 16 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
[info] restoring loopback MTU to 65536

@MDA2AV

MDA2AV commented Aug 8, 2026

Copy link
Copy Markdown
Owner

pls rebase to fix this conflict

@MDA2AV
MDA2AV merged commit b64ddce into MDA2AV:main Aug 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants