Skip to content

Add genhttp-11-ioxide (GenHTTP on the ioxide io_uring engine)#880

Open
MDA2AV wants to merge 6 commits into
mainfrom
genhttp-11-ioxide
Open

Add genhttp-11-ioxide (GenHTTP on the ioxide io_uring engine)#880
MDA2AV wants to merge 6 commits into
mainfrom
genhttp-11-ioxide

Conversation

@MDA2AV

@MDA2AV MDA2AV commented Jun 15, 2026

Copy link
Copy Markdown
Owner

genhttp-11-ioxide

GenHTTP 11 on a custom io_uring server engine (the ioxide runtime) instead of GenHTTP's default socket engine.

The engine runs GenHTTP's own HTTP/1.1 conversation directly on ioxide's per-connection duplex pipe — thread-per-core, one io_uring reactor per core, with chunked transfer-encoding, keep-alive, a per-second cached Date header, and a per-reactor request pool. It's built from the GenHTTP ioxide-engine branch (Kaliumhexacyanoferrat/GenHTTP#860): the Dockerfile clones that branch and the app references its engine + the IO / Layouting / Webservices modules from source.

Profiles — HTTP/1.1 only

The engine doesn't yet do TLS, HTTP/2 or WebSocket, so it subscribes to:

  • baseline — mixed GET/POST with query parsing (/baseline11 sum webservice)
  • pipelined — 16× batched pipelining (/pipeline)
  • limited-conn — short-lived connections (close after 10 requests)

Notes

  • Build needs a Roslyn 5.3+ SDK (GenHTTP's MemoryView source generator); the sdk:10.0 image used by the Dockerfile provides it.
  • Validated locally: baseline (sum), pipelined, limited-conn all serve correctly with keep-alive.

GenHTTP 11 on a custom io_uring server engine (the ioxide runtime) instead of
the default socket engine. Built from the GenHTTP ioxide-engine branch
(Kaliumhexacyanoferrat/GenHTTP#860): the Dockerfile clones that branch and the
app references its engine + IO/Layouting/Webservices modules from source.

Subscribes to the HTTP/1.1 profiles the engine supports: baseline, pipelined,
limited-conn.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

👋 Heads up! This PR modifies the following frameworks:

@MDA2AV

MDA2AV commented Jun 15, 2026

Copy link
Copy Markdown
Owner Author

/benchmark -f genhttp-11-ioxide -t pipelined

@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: genhttp-11-ioxide | Test: pipelined

Test Conn RPS CPU Mem Δ RPS Δ Mem
pipelined 512 3,529,650 6107.9% 1.3GiB NEW NEW
pipelined 4096 3,656,455 6161.4% 1.4GiB NEW NEW
Full log
#6 resolve mcr.microsoft.com/dotnet/runtime:10.0@sha256:8fb7ff015fcf0ebc6e90105bd6db06875954e6dc3d374b9dbb34c732867d13e4 0.0s done
#6 DONE 0.1s

#7 [internal] load build context
#7 transferring context: 5.07kB done
#7 DONE 0.0s

#8 [stage-1 2/3] WORKDIR /app
#8 CACHED

#9 [build 5/6] COPY . .
#9 CACHED

#10 [build 2/6] WORKDIR /src
#10 CACHED

#11 [build 3/6] RUN git clone --depth 1 --branch ioxide-engine https://github.com/Kaliumhexacyanoferrat/GenHTTP.git genhttp
#11 CACHED

#12 [build 4/6] WORKDIR /src/app
#12 CACHED

#13 [build 6/6] RUN dotnet publish genhttp.csproj -c Release --no-self-contained -o /app
#13 CACHED

#14 [stage-1 3/3] COPY --from=build /app .
#14 CACHED

#15 exporting to image
#15 exporting layers done
#15 exporting manifest sha256:42ce52d3ae33c8615519eca0426f33badc8d1d531857b8594831c72403f01fbb done
#15 exporting config sha256:24cb61c59f2182f4f5dfb896f46b1b4a48a7fea1348e776e2b4fc9d628a124ab done
#15 exporting attestation manifest sha256:37f6ef8a9b4e03609aa2ae27abc3ba6627fb8717b9029cf487b5a3a3e451859f 0.0s done
#15 exporting manifest list sha256:e63a46f053f96b8d487e2ad74c3588db25c55c08a2a9b7792348cd41915b75ec 0.0s done
#15 naming to docker.io/library/httparena-genhttp-11-ioxide:latest
#15 naming to docker.io/library/httparena-genhttp-11-ioxide:latest done
#15 unpacking to docker.io/library/httparena-genhttp-11-ioxide:latest done
#15 DONE 0.1s
[info] tuning host for benchmark runs
[info] CPU governor → performance
[info] setting kernel socket limits
[info] setting UDP buffer sizes for QUIC
[info] setting loopback MTU to 1500 (realistic Ethernet)
[info] restarting docker daemon
[info] dropping kernel caches

==============================================
=== genhttp-11-ioxide / pipelined / 512c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/pipeline
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.45ms   2.21ms   3.33ms   8.29ms   19.80ms

  16785594 requests in 5.00s, 16785594 responses
  Throughput: 3.36M req/s
  Bandwidth:  406.50MB/s
  Status codes: 2xx=16785594, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 16785594 / 16785594 responses (100.0%)
[info] CPU 5855.6% | Mem 1.3GiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/pipeline
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.32ms   2.23ms   3.34ms   4.73ms   7.03ms

  17648251 requests in 5.00s, 17648251 responses
  Throughput: 3.53M req/s
  Bandwidth:  427.38MB/s
  Status codes: 2xx=17648251, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 17648194 / 17648251 responses (100.0%)
[info] CPU 6107.9% | Mem 1.3GiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/pipeline
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.32ms   2.07ms   3.57ms   5.15ms   8.16ms

  17634882 requests in 5.00s, 17634881 responses
  Throughput: 3.53M req/s
  Bandwidth:  427.05MB/s
  Status codes: 2xx=17634881, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 17634821 / 17634881 responses (100.0%)
[info] CPU 6104.5% | Mem 1.3GiB

=== Best: 3529650 req/s (CPU: 6107.9%, Mem: 1.3GiB) ===
[info] saved results/pipelined/512/genhttp-11-ioxide.json
httparena-bench-genhttp-11-ioxide
httparena-bench-genhttp-11-ioxide

==============================================
=== genhttp-11-ioxide / pipelined / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/pipeline
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   20.35ms   17.50ms   27.80ms   80.20ms   180.20ms

  16165426 requests in 5.00s, 16165426 responses
  Throughput: 3.23M req/s
  Bandwidth:  391.45MB/s
  Status codes: 2xx=16165426, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 16165426 / 16165426 responses (100.0%)
[info] CPU 5533.1% | Mem 1.3GiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/pipeline
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   17.89ms   16.90ms   21.60ms   37.80ms   48.00ms

  18315046 requests in 5.00s, 18282278 responses
  Throughput: 3.66M req/s
  Bandwidth:  442.71MB/s
  Status codes: 2xx=18282278, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 18282218 / 18282278 responses (100.0%)
[info] CPU 6161.4% | Mem 1.4GiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/pipeline
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   18.08ms   17.10ms   21.60ms   38.40ms   44.20ms

  18126684 requests in 5.00s, 18123612 responses
  Throughput: 3.62M req/s
  Bandwidth:  438.81MB/s
  Status codes: 2xx=18123612, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 18124482 / 18123612 responses (100.0%)
[info] CPU 5868.0% | Mem 1.4GiB

=== Best: 3656455 req/s (CPU: 6161.4%, Mem: 1.4GiB) ===
[info] saved results/pipelined/4096/genhttp-11-ioxide.json
httparena-bench-genhttp-11-ioxide
httparena-bench-genhttp-11-ioxide
[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/pipelined-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
[info] restoring loopback MTU to 65536

@MDA2AV

MDA2AV commented Jun 15, 2026

Copy link
Copy Markdown
Owner Author

/benchmark -f genhttp-11-ioxide -t baseline

@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: genhttp-11-ioxide | Test: baseline

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 2,535,405 5346.3% 1.3GiB NEW NEW
baseline 4096 3,551,487 5839.0% 1.5GiB NEW NEW
Full log

#13 [stage-1 2/3] WORKDIR /app
#13 CACHED

#14 [stage-1 3/3] COPY --from=build /app .
#14 CACHED

#15 exporting to image
#15 exporting layers done
#15 exporting manifest sha256:42ce52d3ae33c8615519eca0426f33badc8d1d531857b8594831c72403f01fbb done
#15 exporting config sha256:24cb61c59f2182f4f5dfb896f46b1b4a48a7fea1348e776e2b4fc9d628a124ab done
#15 exporting attestation manifest sha256:6be8e8a6896fbf2512f14c10f19d3e85466b20f36ad557092341f80b86edeccc
#15 exporting attestation manifest sha256:6be8e8a6896fbf2512f14c10f19d3e85466b20f36ad557092341f80b86edeccc 0.1s done
#15 exporting manifest list sha256:12d2251571e2be1cdea99009e1fc5d1ea29ce1300723eb51ba588d4956c3bc33
#15 exporting manifest list sha256:12d2251571e2be1cdea99009e1fc5d1ea29ce1300723eb51ba588d4956c3bc33 0.1s done
#15 naming to docker.io/library/httparena-genhttp-11-ioxide:latest 0.0s done
#15 unpacking to docker.io/library/httparena-genhttp-11-ioxide:latest 0.0s done
#15 DONE 0.3s
[info] tuning host for benchmark runs
[info] CPU governor → performance
[info] setting kernel socket limits
[info] setting UDP buffer sizes for QUIC
[info] setting loopback MTU to 1500 (realistic Ethernet)
[info] restarting docker daemon
[info] dropping kernel caches

==============================================
=== genhttp-11-ioxide / baseline / 512c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Templates: 3
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     73us     61us     99us    272us    841us

  11649523 requests in 5.00s, 11649523 responses
  Throughput: 2.33M req/s
  Bandwidth:  282.12MB/s
  Status codes: 2xx=11649523, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 11649519 / 11649523 responses (100.0%)
  Per-template: 11649506,13,0
  Per-template-ok: 11649506,13,0
[info] CPU 5086.2% | Mem 1.3GiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Templates: 3
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     66us     59us     94us    144us    814us

  12677025 requests in 5.00s, 12677025 responses
  Throughput: 2.53M req/s
  Bandwidth:  307.01MB/s
  Status codes: 2xx=12677025, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12678813 / 12677025 responses (100.0%)
  Per-template: 12676981,0,0
  Per-template-ok: 12676981,0,0
[info] CPU 5346.3% | Mem 1.3GiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Templates: 3
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency     68us     60us     97us    142us    800us

  12466803 requests in 5.00s, 12466803 responses
  Throughput: 2.49M req/s
  Bandwidth:  301.91MB/s
  Status codes: 2xx=12466803, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12466754 / 12466803 responses (100.0%)
  Per-template: 12466754,0,0
  Per-template-ok: 12466753,0,0
[info] CPU 5326.8% | Mem 1.3GiB

=== Best: 2535405 req/s (CPU: 5346.3%, Mem: 1.3GiB) ===
[info] input BW: 195.85MB/s (avg template: 81 bytes)
[info] saved results/baseline/512/genhttp-11-ioxide.json
httparena-bench-genhttp-11-ioxide
httparena-bench-genhttp-11-ioxide

==============================================
=== genhttp-11-ioxide / baseline / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Templates: 3
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    446us    355us    514us   3.26ms   7.23ms

  15657384 requests in 5.00s, 15657192 responses
  Throughput: 3.13M req/s
  Bandwidth:  379.17MB/s
  Status codes: 2xx=15657192, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 15657192 / 15657192 responses (100.0%)
  Per-template: 15655890,1302,0
  Per-template-ok: 15655890,1302,0
[info] CPU 5353.5% | Mem 1.3GiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Templates: 3
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    389us    342us    488us   2.54ms   5.11ms

  17545363 requests in 5.00s, 17545363 responses
  Throughput: 3.51M req/s
  Bandwidth:  424.87MB/s
  Status codes: 2xx=17545363, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 17545330 / 17545363 responses (100.0%)
  Per-template: 17545138,192,0
  Per-template-ok: 17545138,192,0
[info] CPU 5898.3% | Mem 1.4GiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Templates: 3
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    384us    348us    487us   1.61ms   4.48ms

  17757126 requests in 5.00s, 17757438 responses
  Throughput: 3.55M req/s
  Bandwidth:  429.95MB/s
  Status codes: 2xx=17757438, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 17756876 / 17757438 responses (100.0%)
  Per-template: 17756812,64,0
  Per-template-ok: 17756812,64,0
[info] CPU 5839.0% | Mem 1.5GiB

=== Best: 3551487 req/s (CPU: 5839.0%, Mem: 1.5GiB) ===
[info] input BW: 274.34MB/s (avg template: 81 bytes)
[info] saved results/baseline/4096/genhttp-11-ioxide.json
httparena-bench-genhttp-11-ioxide
httparena-bench-genhttp-11-ioxide
[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/baseline-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
[info] restoring loopback MTU to 65536

@MDA2AV

MDA2AV commented Jun 15, 2026

Copy link
Copy Markdown
Owner Author

/benchmark -f genhttp-11-ioxide

@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: genhttp-11-ioxide | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 3,051,221 6091.6% 1.3GiB NEW NEW
baseline 4096 3,120,133 5871.3% 1.4GiB NEW NEW
pipelined 512 21,667,030 6056.4% 1.3GiB NEW NEW
pipelined 4096 21,615,980 5964.4% 1.4GiB NEW NEW
limited-conn 512 2,236,436 5586.7% 1.3GiB NEW NEW
limited-conn 4096 2,553,261 5961.7% 1.5GiB NEW NEW
Full log
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Templates: 3
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    258us    188us    409us   1.53ms   6.25ms

  9430788 requests in 5.00s, 9430815 responses
  Throughput: 1.89M req/s
  Bandwidth:  228.37MB/s
  Status codes: 2xx=9430815, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 9430813 / 9430815 responses (100.0%)
  Reconnects: 943055
  Per-template: 3143565,3143766,3143482
  Per-template-ok: 3143565,3143766,3143482
[info] CPU 5029.6% | Mem 1.4GiB

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    215us    181us    363us    740us   2.50ms

  11154613 requests in 5.00s, 11154586 responses
  Throughput: 2.23M req/s
  Bandwidth:  270.10MB/s
  Status codes: 2xx=11154586, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 11155887 / 11154586 responses (100.0%)
  Reconnects: 1115452
  Per-template: 3718187,3718182,3718177
  Per-template-ok: 3718187,3718181,3718177
[info] CPU 5616.0% | Mem 1.3GiB

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    215us    181us    363us    727us   2.49ms

  11182183 requests in 5.00s, 11182181 responses
  Throughput: 2.24M req/s
  Bandwidth:  270.79MB/s
  Status codes: 2xx=11182181, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 11185424 / 11182181 responses (100.0%)
  Reconnects: 1118227
  Per-template: 3727407,3727305,3727425
  Per-template-ok: 3727407,3727305,3727425
[info] CPU 5586.7% | Mem 1.3GiB

=== Best: 2236436 req/s (CPU: 5586.7%, Mem: 1.3GiB) ===
[info] input BW: 172.76MB/s (avg template: 81 bytes)
[info] saved results/limited-conn/512/genhttp-11-ioxide.json
httparena-bench-genhttp-11-ioxide
httparena-bench-genhttp-11-ioxide

==============================================
=== genhttp-11-ioxide / limited-conn / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.86ms   1.32ms   2.53ms   12.60ms   34.40ms

  10541819 requests in 5.00s, 10542108 responses
  Throughput: 2.11M req/s
  Bandwidth:  255.25MB/s
  Status codes: 2xx=10542108, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 10542108 / 10542108 responses (100.0%)
  Reconnects: 1052546
  Per-template: 3513757,3514323,3514028
  Per-template-ok: 3513757,3514323,3514028
[info] CPU 5070.7% | Mem 1.6GiB

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.50ms   1.30ms   2.17ms   5.19ms   8.96ms

  12761474 requests in 5.00s, 12761468 responses
  Throughput: 2.55M req/s
  Bandwidth:  309.00MB/s
  Status codes: 2xx=12761468, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12761441 / 12761468 responses (100.0%)
  Reconnects: 1276061
  Per-template: 4253681,4253587,4254173
  Per-template-ok: 4253681,4253587,4254173
[info] CPU 6083.9% | Mem 1.5GiB

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


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.50ms   1.30ms   2.17ms   5.02ms   9.41ms

  12766221 requests in 5.00s, 12766307 responses
  Throughput: 2.55M req/s
  Bandwidth:  309.12MB/s
  Status codes: 2xx=12766307, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12766243 / 12766307 responses (100.0%)
  Reconnects: 1276594
  Per-template: 4255246,4255630,4255367
  Per-template-ok: 4255246,4255630,4255367
[info] CPU 5961.7% | Mem 1.5GiB

=== Best: 2553261 req/s (CPU: 5961.7%, Mem: 1.5GiB) ===
[info] input BW: 197.23MB/s (avg template: 81 bytes)
[info] saved results/limited-conn/4096/genhttp-11-ioxide.json
httparena-bench-genhttp-11-ioxide
httparena-bench-genhttp-11-ioxide
[info] skip: genhttp-11-ioxide does not subscribe to json
[info] skip: genhttp-11-ioxide does not subscribe to json-comp
[info] skip: genhttp-11-ioxide does not subscribe to json-tls
[info] skip: genhttp-11-ioxide does not subscribe to upload
[info] skip: genhttp-11-ioxide does not subscribe to api-4
[info] skip: genhttp-11-ioxide does not subscribe to api-16
[info] skip: genhttp-11-ioxide does not subscribe to static
[info] skip: genhttp-11-ioxide does not subscribe to async-db
[info] skip: genhttp-11-ioxide does not subscribe to crud
[info] skip: genhttp-11-ioxide does not subscribe to fortunes
[info] skip: genhttp-11-ioxide does not subscribe to baseline-h2
[info] skip: genhttp-11-ioxide does not subscribe to static-h2
[info] skip: genhttp-11-ioxide does not subscribe to baseline-h2c
[info] skip: genhttp-11-ioxide does not subscribe to json-h2c
[info] skip: genhttp-11-ioxide does not subscribe to baseline-h3
[info] skip: genhttp-11-ioxide does not subscribe to static-h3
[info] skip: genhttp-11-ioxide does not subscribe to gateway-64
[info] skip: genhttp-11-ioxide does not subscribe to gateway-h3
[info] skip: genhttp-11-ioxide does not subscribe to production-stack
[info] skip: genhttp-11-ioxide does not subscribe to unary-grpc
[info] skip: genhttp-11-ioxide does not subscribe to unary-grpc-tls
[info] skip: genhttp-11-ioxide does not subscribe to stream-grpc
[info] skip: genhttp-11-ioxide does not subscribe to stream-grpc-tls
[info] skip: genhttp-11-ioxide does not subscribe to echo-ws
[info] skip: genhttp-11-ioxide does not subscribe to echo-ws-pipeline
[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/baseline-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
[info] restoring loopback MTU to 65536

MDA2AV added 5 commits June 17, 2026 20:31
- TFM net10.0 -> net11.0 (matches the GenHTTP ioxide-engine branch on net11)
- Dockerfile: sdk 10.0 -> 11.0.100-preview.5, runtime 10.0 -> 11.0.0-preview.5
- README build note + meta description updated for .NET 11
- json, json-comp, upload, static (GenHTTP handlers; json via GenHTTP serialization)
- async-db, crud via ioxide.pg (per-reactor pool resolved through the engine seam);
  in-process cache-aside for crud
- json-tls on :8081 via ioxide.tls (kTLS TX) through the connection-transport seam
- api-4 / api-16 reuse the above at 4 / 16 reactors
- meta.json tests, Dockerfile EXPOSE 8081, README updated
…essed

Size the ioxide write slab above the largest static asset (only when static is mounted, so the
high-connection profiles keep the small per-connection buffer), and serve precompressed .br
siblings via Assets.AllowPrecompressed. GenHTTP's file copy requests a 64 KB buffer that overflows
the default 16 KB slab, so large assets (e.g. components.css) faulted and the static profile
validation timed out with 0 bytes.
The validator expects the crud list to echo total + page (load-more semantics: total == count ==
rows on the page). Return a ListResponse carrying those fields instead of the plain DbResponse.
…astructure)

Match the frameworks/genhttp-11 entry's file structure so the two stay easy to
diff:

  Model.cs                      shared DTOs (DatasetItem/ProcessedItem/RatingInfo,
                                ListWithCount<T>, CrudListResponse, CrudItem)
  Tests/{Json,Upload,Baseline,AsyncDatabase,Crud}.cs
  Infrastructure/Postgres.cs    ioxide.pg pool wiring + row mapping
  Infrastructure/TlsTransport.cs

Webservices return model types that GenHTTP's serializer renders; crud is a
sublayout at /crud/items. Behaviour matches the previous flat layout — all 12
profiles (json/json-comp/json-tls/async-db/crud/static/upload/baseline/pipeline)
re-verified against a seeded Postgres and kTLS. Unlike genhttp-11 this entry keeps
ioxide.pg / ioxide.tls and omits the websocket (the ioxide engine can't serve it).
@MDA2AV

MDA2AV commented Jun 18, 2026

Copy link
Copy Markdown
Owner Author

/benchmark -f genhttp-11-ioxide

@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: genhttp-11-ioxide | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 3,011,328 6137.0% 1.3GiB NEW NEW
baseline 4096 3,196,226 5923.5% 1.4GiB NEW NEW
pipelined 512 20,780,681 6027.7% 1.3GiB NEW NEW
pipelined 4096 20,346,697 5629.9% 1.4GiB NEW NEW
limited-conn 512 2,219,016 5697.6% 1.4GiB NEW NEW
limited-conn 4096 2,587,629 5967.9% 1.5GiB NEW NEW
json 4096 1,116,391 6164.2% 1.7GiB NEW NEW
json-comp 512 546,844 5787.3% 1.6GiB NEW NEW
json-comp 4096 564,528 6078.1% 1.8GiB NEW NEW
json-comp 16384 553,486 5975.6% 2.1GiB NEW NEW
json-tls 4096 857,113 6289.7% 2.1GiB NEW NEW
upload 32 2,038 1963.9% 8.2GiB NEW NEW
upload 256 2,044 5124.1% 8.3GiB NEW NEW
api-4 256 65,708 372.1% 241MiB NEW NEW
api-16 1024 186,498 1489.2% 628MiB NEW NEW
static 1024 559,844 6378.1% 1.4GiB NEW NEW
static 4096 534,029 6350.8% 1.7GiB NEW NEW
static 6800 503,389 6286.5% 2.0GiB NEW NEW
async-db 1024 271,882 3312.4% 1.5GiB NEW NEW
crud 4096 655,159 4038.8% 1.7GiB NEW NEW
Full log
  Throughput: 238.06K req/s
  Bandwidth:  919.52MB/s
  Status codes: 2xx=2381034, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 2381034 / 2381034 responses (100.0%)
  Reconnects: 94753
  Per-template: 474430,475895,477748,477618,475343
  Per-template-ok: 474430,475895,477748,477618,475343
[info] CPU 4233.5% | Mem 1.5GiB

[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   3.17ms   2.65ms   6.27ms   11.00ms   19.10ms

  2712503 requests in 10.00s, 2712507 responses
  Throughput: 271.20K req/s
  Bandwidth:  1.02GB/s
  Status codes: 2xx=2712507, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 2712502 / 2712507 responses (100.0%)
  Reconnects: 108465
  Per-template: 540445,542226,544112,544138,541581
  Per-template-ok: 540445,542226,544112,544138,541581
[info] CPU 3284.3% | Mem 1.5GiB

[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   3.20ms   2.70ms   6.28ms   10.90ms   18.50ms

  2718821 requests in 10.00s, 2718823 responses
  Throughput: 271.82K req/s
  Bandwidth:  1.03GB/s
  Status codes: 2xx=2718823, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 2718821 / 2718823 responses (100.0%)
  Reconnects: 108824
  Per-template: 542062,543581,545633,545014,542531
  Per-template-ok: 542062,543581,545633,545014,542531
[info] CPU 3312.4% | Mem 1.5GiB

=== Best: 271882 req/s (CPU: 3312.4%, Mem: 1.5GiB) ===
[info] input BW: 18.15MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/genhttp-11-ioxide.json
httparena-bench-genhttp-11-ioxide
httparena-bench-genhttp-11-ioxide

==============================================
=== genhttp-11-ioxide / crud / 4096c (tool=gcannon) ===
==============================================
[info] resetting postgres for a clean per-profile baseline
[info] starting postgres sidecar
httparena-postgres
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   7.08ms   4.02ms   17.80ms   33.30ms   65.10ms

  8401533 requests in 15.00s, 8401533 responses
  Throughput: 560.01K req/s
  Bandwidth:  215.20MB/s
  Status codes: 2xx=8401533, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 8401533 / 8401533 responses (100.0%)
  Reconnects: 40005
  Per-template: 330701,296042,292990,303057,322514,343029,364013,384830,407050,431168,456370,479948,503799,522442,534941,542246,531876,494888,457168,402461
  Per-template-ok: 330701,296042,292990,303057,322514,343029,364013,384830,407050,431168,456370,479948,503799,522442,534941,542246,531876,494888,457168,402461
[info] CPU 4245.9% | Mem 1.6GiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.99ms   2.81ms   16.70ms   29.30ms   39.90ms

  9649931 requests in 15.00s, 9649931 responses
  Throughput: 643.23K req/s
  Bandwidth:  244.76MB/s
  Status codes: 2xx=9649931, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 9649905 / 9649931 responses (100.0%)
  Reconnects: 46293
  Per-template: 466897,433375,428607,416899,407377,400979,402779,411234,426336,447082,468211,489897,514770,540545,563851,588164,597359,584552,549356,511635
  Per-template-ok: 466897,433375,428607,416899,407377,400979,402779,411234,426336,447082,468211,489897,514770,540545,563851,588164,597359,584552,549356,511635
[info] CPU 4000.4% | Mem 1.7GiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.83ms   2.70ms   16.40ms   29.30ms   40.00ms

  9827397 requests in 15.00s, 9827397 responses
  Throughput: 655.06K req/s
  Bandwidth:  248.59MB/s
  Status codes: 2xx=9827398, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 9827366 / 9827397 responses (100.0%)
  Reconnects: 47257
  Per-template: 471896,444815,445095,434850,426227,417365,416836,424266,436013,455217,476797,498929,520609,543424,566978,592755,600352,583684,552592,518666
  Per-template-ok: 471896,444815,445095,434850,426227,417365,416836,424266,436013,455217,476797,498929,520609,543424,566978,592755,600352,583684,552592,518666

  WARNING: 18446744073709551615/9827397 responses (187707325487202.3%) had unexpected status (expected 2xx)
[info] CPU 4038.8% | Mem 1.7GiB

=== Best: 655159 req/s (CPU: 4038.8%, Mem: 1.7GiB) ===
[info] input BW: 56.23MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/genhttp-11-ioxide.json
httparena-bench-genhttp-11-ioxide
httparena-bench-genhttp-11-ioxide
[info] skip: genhttp-11-ioxide does not subscribe to fortunes
[info] skip: genhttp-11-ioxide does not subscribe to baseline-h2
[info] skip: genhttp-11-ioxide does not subscribe to static-h2
[info] skip: genhttp-11-ioxide does not subscribe to baseline-h2c
[info] skip: genhttp-11-ioxide does not subscribe to json-h2c
[info] skip: genhttp-11-ioxide does not subscribe to baseline-h3
[info] skip: genhttp-11-ioxide does not subscribe to static-h3
[info] skip: genhttp-11-ioxide does not subscribe to gateway-64
[info] skip: genhttp-11-ioxide does not subscribe to gateway-h3
[info] skip: genhttp-11-ioxide does not subscribe to production-stack
[info] skip: genhttp-11-ioxide does not subscribe to unary-grpc
[info] skip: genhttp-11-ioxide does not subscribe to unary-grpc-tls
[info] skip: genhttp-11-ioxide does not subscribe to stream-grpc
[info] skip: genhttp-11-ioxide does not subscribe to stream-grpc-tls
[info] skip: genhttp-11-ioxide does not subscribe to echo-ws
[info] skip: genhttp-11-ioxide does not subscribe to echo-ws-pipeline
[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/api-16-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-4-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/async-db-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/crud-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-16384.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-tls-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-6800.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-32.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

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.

1 participant