Skip to content

Upgrade dusty to version 0.6 - #1784

Open
lalinsky wants to merge 5 commits into
MDA2AV:mainfrom
lalinsky:main
Open

lalinsky wants to merge 5 commits into
MDA2AV:mainfrom
lalinsky:main

Conversation

@lalinsky

@lalinsky lalinsky commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

Description

Upgrade dusty to 0.6, zio to 0.20.

Changes:

  • faster router
  • more flexible handlers/middleware
  • stricter behaviors after checking the server against HTTP Garden
  • TLS is now based on AWS-LC, standard entry uses libssl wrapper, tuned entry uses native protocol implementation on top of libcrypto, both are more compliant than the previously used tls.zig
  • and zio brings in some performance improvements and many bug fixes

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> -t <t1>,<t2>,... Run several tests in one job: one approval, one results commit, untouched tests keep their numbers
/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
/spec -f <framework> Run the protocol-compliance suites the framework lists in spec in its meta.json
/spec -f <framework> --save Run them and save the scores to site/data/spec/ (lands with the merge, like saved 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.

A /benchmark without -t also runs the compliance suites, and its --save saves their scores with the results. /spec runs the suites alone; without -f it runs them for every framework the PR touches. See Compliance.

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 --compare genhttp-kestrel

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) are built as self-contained Docker images on first run.

@lalinsky

Copy link
Copy Markdown
Contributor Author

/benchmark --save
/spec --save

@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: dusty | Test: all tests

Test Conn RPS Rate CPU/req p99 p99.9 CPU Mem Δ RPS Δ Mem
baseline 4096 3,323,203 — — — — 6332.9% 231MiB -2.8% +15.5%
pipelined 4096 4,259,821 — — — — 6440.9% 233MiB -3.0% +14.8%
limited-conn 4096 2,535,173 — — — — 6120.5% 92MiB +23.5% -9.8%
json-comp 4096 549,586 — — — — 6281.8% 292MiB -1.6% +231.8%
json-comp 16384 542,531 — — — — 6558.8% 555MiB -2.9% +56.8%
json-tls 4096 1,147,761 — — — — 6595.4% 426MiB -4.3% -42.7%
8gbit 512 49,351 0.9870 46.55us 117.0us 4802.0us 229.8% 89MiB ~0% -25.8%
static-tls 1024 381,806 — — — — 6569.6% 196MiB +4.5% -2.5%
async-db 1024 304,196 — — — — 3968.2% 164MiB +3.4% +25.2%
fortunes 1024 276,336 — — — — 5103.4% 158MiB +0.9% +4.6%
echo-ws 512 4,033,942 — — — — 6541.7% 59MiB -0.7% +18.0%
echo-ws 4096 3,945,477 — — — — 6538.4% 224MiB -0.4% +10.9%
echo-ws 16384 3,266,574 — — — — 6142.1% 786MiB -6.8% +10.5%
echo-ws-pipeline 512 59,109,183 — — — — 6454.7% 64MiB +0.1% +20.8%
echo-ws-pipeline 4096 57,590,595 — — — — 6583.5% 226MiB +0.6% +4.6%
echo-ws-pipeline 16384 46,200,510 — — — — 6622.7% 786MiB -6.0% +7.4%
echo-ws-limited 512 2,242,739 — — — — 6417.1% 76MiB +4.0% +43.4%
echo-ws-limited 4096 2,512,674 — — — — 6037.0% 206MiB +21.5% +96.2%
latency-1m 1024 997,337 0.9973 27.05us 202.0us 7938.0us 2941.0% 82MiB ~0% +15.5%
latency-10k 1024 9,983 0.9983 27.34us 102.0us 153.0us 26.2% 86MiB ~0% +26.5%
latency-500k-8cpu 1024 412,352 0.8247 ⚠️ 19.33us 6002688.0us 6236160.0us 793.0% 59MiB -2.0% +1.7%
async 32000 2,130,544 — — — — 6266.6% 1.4GiB -4.5% +7.7%

Composite score, main against this run, in the board's default view:

Family main this run Δ
HTTP/1.1 6980.1 (5 of 107) 7102.3 (4 of 107) +122.2
WebSocket 2855.5 (2 of 39) 2916.7 (1 of 39) +61.2

The results on main were measured in another session, so a few points up or down can be the machine and not the change.

Compliance

Suite Tool Score Failed
H/1.1 (h1) http11probe d50d818 155 / 159 4
WebSocket (ws) autobahn-testsuite 25.10.1 244 / 244 0
H/1.1: 4 failed
Test Expected Got
COMP-OPTIONS-STAR OPTIONS * is the only valid asterisk-form request (RFC 9112 §3.2.4, MUST) 2xx or 405; close/timeout = warn 404, connection left open
COMP-METHOD-CONNECT CONNECT to an origin server must be rejected (RFC 9110 §9.3.6, SHOULD) 400/405/501 or close 404, connection closed
COMP-HOST-EMPTY-VALUE Empty Host header value must be rejected (RFC 9112 §3.2, MUST) 400 or close 200, connection left open
SMUG-TE-LEADING-COMMA Transfer-Encoding with leading comma (, chunked) — RFC says empty list elements MUST be ignored (RFC 9110 §5.6.1, SHOULD) 400 or 2xx 501, connection closed

@lalinsky

Copy link
Copy Markdown
Contributor Author

Hm, that did not auto-detect dusty-tuned

@MDA2AV

MDA2AV commented Nov 14, 2026

Copy link
Copy Markdown
Owner

you didnt add the -multiple

@MDA2AV

MDA2AV commented Nov 14, 2026

Copy link
Copy Markdown
Owner

/benchmark -f dusty-tuned --save

@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: dusty-tuned | Test: all tests

Test Conn RPS Rate CPU/req p99 p99.9 CPU Mem Δ RPS Δ Mem
baseline 4096 3,399,844 — — — — 6375.6% 248MiB -0.9% +23.4%
pipelined 4096 4,314,403 — — — — 6022.5% 234MiB -2.4% +14.1%
limited-conn 4096 2,535,904 — — — — 6099.3% 98MiB +23.3% -3.9%
json-comp 4096 650,945 — — — — 6610.6% 684MiB -5.5% +620.0%
json-comp 16384 654,739 — — — — 6174.9% 1.1GiB -3.2% +191.8%
json-tls 4096 1,879,440 — — — — 6402.0% 362MiB +15.5% -51.3%
8gbit 512 49,369 0.9874 41.40us 108.0us 4106.0us 185.4% 85MiB +0.2% -29.2%
static-tls 1024 418,559 — — — — 6636.1% 137MiB +14.6% -31.8%
async-db 1024 349,417 — — — — 3827.2% 158MiB +5.4% +23.4%
fortunes 1024 282,348 — — — — 5081.9% 161MiB +2.1% +3.9%
latency-1m 1024 997,723 0.9977 26.83us 199.0us 2387.0us 2916.5% 88MiB ~0% +25.7%
latency-10k 1024 9,979 0.9979 25.83us 104.0us 6470.0us 24.8% 77MiB ~0% +16.7%
latency-500k-8cpu 1024 422,655 0.8453 ⚠️ 18.85us 6486016.0us 7034880.0us 792.2% 67MiB ~0% +15.5%
async 32000 2,227,512 — — — — 6361.4% 1.5GiB -1.4% +15.4%

Composite score, main against this run, in the board's default view:

Family main this run Δ
HTTP/1.1 7394.4 (1 of 107) 7745.2 (1 of 107) +350.9
WebSocket 2854.2 (3 of 39) 2854.2 (3 of 39) +0.0

The results on main were measured in another session, so a few points up or down can be the machine and not the change.

Compliance

Suite Tool Score Failed
H/1.1 (h1) http11probe d50d818 155 / 159 4
H/1.1: 4 failed
Test Expected Got
COMP-OPTIONS-STAR OPTIONS * is the only valid asterisk-form request (RFC 9112 §3.2.4, MUST) 2xx or 405; close/timeout = warn 404, connection left open
COMP-METHOD-CONNECT CONNECT to an origin server must be rejected (RFC 9110 §9.3.6, SHOULD) 400/405/501 or close 404, connection closed
COMP-HOST-EMPTY-VALUE Empty Host header value must be rejected (RFC 9112 §3.2, MUST) 400 or close 200, connection left open
SMUG-TE-LEADING-COMMA Transfer-Encoding with leading comma (, chunked) — RFC says empty list elements MUST be ignored (RFC 9110 §5.6.1, SHOULD) 400 or 2xx 501, connection closed

@lalinsky

Copy link
Copy Markdown
Contributor Author

Oh, one more thing, I unsubscribed the tuned entry from websocket, as it doesn't add anything over the standard one, but I guess I need to delete the previous files as well?

@MDA2AV

MDA2AV commented Nov 14, 2026

Copy link
Copy Markdown
Owner

hmm, yes need to delete the data on websockets at the results json for tuned

The tuned entry no longer subscribes to the WebSocket tests.
@lalinsky

Copy link
Copy Markdown
Contributor Author

ok, deleted

@lalinsky

Copy link
Copy Markdown
Contributor Author

Sorry about the mess, I had to add one more commit. The last CI failed, the PG startup was probably slower than usual and that disabled the fortunes/async-db endpoints. Should be more stable now.

This branch has not been deployed

No deployments
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