You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
First, thank you for picking up the benchmarking torch after TechEmpower.
This PR adds Cardigan, a Java HTTP engine built on io_uring, Panama FFI and virtual threads. The submission uses the published dev.cardigan:cardigan:0.1.0-alpha1 artifact fresh off Maven Central. It covers HTTP/1.1, HTTP/2 over TLS, h2c, JSON over TLS, and unary and server-streaming gRPC. The entries share one implementation and subscribe to non-overlapping profiles.
One caveat: validate.sh currently has no gRPC-specific readiness or endpoint validation, so it fails before exercising gRPC-only entries. I verified Cardigan's unary and server-streaming variants directly with ghz, over both cleartext and TLS. WTX encountered the same validator limitation in #812.
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.
17Main benchmark duration is started for thread #50.
.
.
52.
.Main benchmark duration is started for thread #33.
. Stopping all clients.
. Stopping all clients.
. Stopping all clients.
41
25
. Stopping all clients.
finished in 5.06s, 14692581.60 req/s, 518.45MB/s
requests: 73462908 total, 73565308 started, 73462908 done, 73462908 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 73462908 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 2.53GB (2718152172) total, 1.23GB (1322332344) headers (space savings 61.70%), 70.06MB (73462908) data
min max mean sd +/- sd
time for request: 161us 48.47ms 4.20ms 2.85ms 88.49%
time for connect: 17us 4.23ms 963us 649us 67.48%
time to 1st byte: 2.65ms 51.57ms 19.32ms 9.00ms 67.19%
req/s : 13715.96 15563.53 14343.64 267.82 69.82%
[info] CPU 1516.9% | Mem 5.4GiB
[run 3/3]
starting benchmark...
.
Application protocol: h2c
23.Main benchmark duration is started for thread #53.
60Warm-up phase is over for thread #Main benchmark duration is started for thread #
8Main benchmark duration is started for thread #1.
.
.
58.
.
29.
17.
.
.
49Stopped all clients for thread #58
. Stopping all clients.
54Stopped all clients for thread #60
. Stopping all clients.
57Main benchmark duration is over for thread #37. Stopping all clients.
9. Stopping all clients.Main benchmark duration is over for thread #35. Stopping all clients.
12Stopped all clients for thread #42. Stopping all clients.
finished in 5.05s, 7218597.60 req/s, 254.72MB/s
requests: 36092988 total, 36195388 started, 36092988 done, 36092988 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 36092988 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 1.24GB (1335465132) total, 619.58MB (649673784) headers (space savings 61.70%), 34.42MB (36092988) data
min max mean sd +/- sd
time for request: 99us 204.92ms 27.06ms 31.59ms 83.24%
time for connect: 23us 2.49ms 902us 552us 63.28%
time to 1st byte: 4.35ms 196.99ms 89.89ms 44.59ms 62.79%
req/s : 976.72 72596.08 7047.95 10641.43 91.50%
[info] CPU 6140.3% | Mem 5.4GiB
=== Best: 14518361 req/s (CPU: 1516.9%, Mem: 5.4GiB) ===
[info] saved results/baseline-h2c/1024/cardigan-h2c.json
httparena-bench-cardigan-h2c
httparena-bench-cardigan-h2c
==============================================
=== cardigan-h2c / baseline-h2c / 4096c (tool=h2load) ===
==============================================
[info] waiting for server...
[info] server ready
[run 1/3]
starting benchmark...
41.
65Main benchmark duration is started for thread #32% of clients started.
.
43.
.
Application protocol: Warm-up phase is over for thread #h2c62
.
.Warm-up phase is over for thread #28.
.
53.
46.
.
27. Stopping all clients.
. Stopping all clients.Stopped all clients for thread #47
24. Stopping all clients.
34. Stopping all clients.Main benchmark duration is over for thread #
5. Stopping all clients.
. Stopping all clients.
4
. Stopping all clients.
finished in 5.10s, 1347786.60 req/s, 47.58MB/s
requests: 6738933 total, 7148533 started, 6738933 done, 6738933 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 6739107 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 237.89MB (249443523) total, 115.68MB (121303926) headers (space savings 61.70%), 6.43MB (6738933) data
min max mean sd +/- sd
time for request: 16.55ms 4.97s 373.53ms 295.87ms 83.62%
time for connect: 16us 17.73ms 7.23ms 4.96ms 53.34%
time to 1st byte: 172.11ms 1.22s 914.45ms 148.47ms 75.27%
req/s : 83.95 953.84 328.90 98.84 89.99%
[info] CPU 6043.1% | Mem 6.1GiB
[run 2/3]
starting benchmark...
57.
50.
62Warm-up phase is over for thread #.
40Main benchmark duration is started for thread #62.
.
49Main benchmark duration is started for thread #10.
.
.
35.
6.
61.
2.
Application protocol: h2c
62
finished in 5.09s, 13919703.00 req/s, 491.19MB/s
requests: 69598515 total, 70008115 started, 69598515 done, 69598515 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 69598515 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 2.40GB (2575243359) total, 1.17GB (1252773270) headers (space savings 61.70%), 66.37MB (69598515) data
min max mean sd +/- sd
time for request: 1.29ms 260.95ms 18.27ms 10.72ms 87.24%
time for connect: 18us 18.32ms 5.69ms 3.80ms 57.42%
time to 1st byte: 7.47ms 283.37ms 56.74ms 35.17ms 85.35%
req/s : 3175.33 3573.13 3392.63 49.01 73.71%
[info] CPU 1308.0% | Mem 6.3GiB
[run 3/3]
starting benchmark...
53Main benchmark duration is started for thread #.5.
.Warm-up phase is over for thread #Warm-up phase is over for thread #
2.22.
21.
progress: .65
9.
Application protocol: h2c
7.
finished in 5.09s, 1569320.80 req/s, 55.40MB/s
requests: 7846604 total, 8256204 started, 7846604 done, 7846604 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 7846975 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 276.98MB (290432669) total, 134.70MB (141245550) headers (space savings 61.70%), 7.48MB (7846604) data
min max mean sd +/- sd
time for request: 2.42ms 4.92s 263.50ms 104.68ms 75.65%
time for connect: 17us 18.72ms 6.14ms 4.65ms 59.57%
time to 1st byte: 7.41ms 773.79ms 379.93ms 139.71ms 75.93%
req/s : 103.57 639.66 382.97 65.71 73.51%
[info] CPU 6275.5% | Mem 6.4GiB
=== Best: 13673578 req/s (CPU: 1308.0%, Mem: 6.3GiB) ===
[info] saved results/baseline-h2c/4096/cardigan-h2c.json
httparena-bench-cardigan-h2c
httparena-bench-cardigan-h2c
[info] skip: cardigan-h2c does not subscribe to json-h2c
[info] skip: cardigan-h2c does not subscribe to baseline-h3
[info] skip: cardigan-h2c does not subscribe to static-h3
[info] skip: cardigan-h2c does not subscribe to gateway-64
[info] skip: cardigan-h2c does not subscribe to gateway-h3
[info] skip: cardigan-h2c does not subscribe to production-stack
[info] skip: cardigan-h2c does not subscribe to unary-grpc
[info] skip: cardigan-h2c does not subscribe to unary-grpc-tls
[info] skip: cardigan-h2c does not subscribe to stream-grpc
[info] skip: cardigan-h2c does not subscribe to stream-grpc-tls
[info] skip: cardigan-h2c does not subscribe to echo-ws
[info] skip: cardigan-h2c does not subscribe to echo-ws-pipeline
[info] skip: cardigan-h2c 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/cardigan.json - 3 new, 13 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
[info] restoring loopback MTU to 65536
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
First, thank you for picking up the benchmarking torch after TechEmpower.
This PR adds Cardigan, a Java HTTP engine built on io_uring, Panama FFI and virtual threads. The submission uses the published
dev.cardigan:cardigan:0.1.0-alpha1artifact fresh off Maven Central. It covers HTTP/1.1, HTTP/2 over TLS, h2c, JSON over TLS, and unary and server-streaming gRPC. The entries share one implementation and subscribe to non-overlapping profiles.One caveat:
validate.shcurrently has no gRPC-specific readiness or endpoint validation, so it fails before exercising gRPC-only entries. I verified Cardigan's unary and server-streaming variants directly withghz, over both cleartext and TLS. WTX encountered the same validator limitation in #812.PR Commands — comment on this PR to trigger (requires collaborator approval):
/benchmark -f <framework>/benchmark -f <framework> -t <test>/benchmark -f <framework> --save/benchmark -f <framework> -t <test> --save/benchmark -f <framework> --compare <other>/benchmark-multiple -f <fw1>,<fw2>,...-tand--savetoo; saved results land in a single commit/benchmark-multiple --save-fneeded: benchmark and save every framework the PR touches/benchmark-test -t <test><test>and save the resultsFor
/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.--compareworks 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,--comparere-bases them on another entry instead:The reply states which baseline it used, and profiles the other framework does not run show
n/arather 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.
Requirements: Docker Engine on Linux. Load generators (gcannon, h2load, h2load-h3, wrk, ghz) are built as self-contained Docker images on first run.