Skip to content

ioxide entry: update to 0.0.8 + extract handler#889

Open
MDA2AV wants to merge 5 commits into
mainfrom
feat/ioxide-engine-0.0.8
Open

ioxide entry: update to 0.0.8 + extract handler#889
MDA2AV wants to merge 5 commits into
mainfrom
feat/ioxide-engine-0.0.8

Conversation

@MDA2AV

@MDA2AV MDA2AV commented Jun 19, 2026

Copy link
Copy Markdown
Owner

Updates the frameworks/ioxide (ioxide engine) entry to ioxide 0.0.8.

Changes

  • Refactor — the request loop (TLS handshake, async-db, crud, send-first) is extracted from Program.cs into a dedicated Handler.cs; HttpSession.cs adjusted, Program.cs becomes wiring only.
  • Packages 0.0.5 → 0.0.8ioxide, ioxide.pg, ioxide.file, ioxide.tls, ioxide.redis (revalidated asset cache + opt-in zero-copy send).
  • TFM net10.0net11.0 — 0.0.8 is net11-only.

Verified

Builds clean against 0.0.8; smoke run (2 reactors): /json/5 → valid JSON, /baseline?a=2&b=35.

Note

CI is red until ioxide 0.0.8 is published to nuget.org — this entry builds against the published packages (locally it resolves from a feed). The Dockerfile also needs the net11 SDK.

MDA2AV added 2 commits June 19, 2026 15:05
Move the TLS handshake / async-db / crud / send-first loop out of Program.cs into a dedicated
Handler.cs; HttpSession adjusted to match. Program.cs becomes wiring only.
ioxide/ioxide.pg/ioxide.file/ioxide.tls/ioxide.redis 0.0.5 -> 0.0.8 (revalidated asset cache +
opt-in zero-copy send). TFM net10.0 -> net11.0 (0.0.8 is net11-only). README -> 0.0.8.
MDA2AV added 2 commits June 19, 2026 15:08
Set ServerConfig.WriteSlabSize to 128 KB so a static response fits a single slab and the handler
sends it in one shot instead of chunk-flushing. Files larger than 128 KB still chunk.
The entry retargeted to net11 (ioxide 0.0.8 is net11-only), so the build SDK and runtime base
images move 10.0 -> 11.0-preview to match.
@MDA2AV

MDA2AV commented Jun 19, 2026

Copy link
Copy Markdown
Owner Author

/benchmark -f 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: ioxide | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 4,116,728 6321.1% 260MiB NEW NEW
baseline 4096 4,159,849 6231.1% 350MiB NEW NEW
pipelined 512 54,425,883 6314.5% 226MiB NEW NEW
pipelined 4096 54,146,502 6152.7% 332MiB NEW NEW
limited-conn 512 2,496,870 5285.3% 312MiB NEW NEW
limited-conn 4096 2,569,229 5395.3% 490MiB NEW NEW
json 4096 1,721,553 5958.0% 788MiB NEW NEW
json-comp 512 916,820 5838.0% 509MiB NEW NEW
json-comp 4096 903,947 6084.0% 1.5GiB NEW NEW
json-comp 16384 932,478 6280.3% 5.0GiB NEW NEW
json-tls 4096 1,791,508 6251.7% 1.1GiB NEW NEW
upload 32 2,401 1936.0% 435MiB NEW NEW
upload 256 3,130 5727.9% 529MiB NEW NEW
api-4 256 71,918 284.5% 110MiB NEW NEW
api-16 1024 248,877 1134.8% 319MiB NEW NEW
static 1024 919,421 6520.3% 323MiB NEW NEW
static 4096 877,045 6597.0% 591MiB NEW NEW
static 6800 848,810 6295.6% 863MiB NEW NEW
async-db 1024 358,361 2989.1% 403MiB NEW NEW
crud 4096 810,138 3326.6% 680MiB NEW NEW
Full log

  3472583 requests in 10.00s, 3472585 responses
  Throughput: 347.19K req/s
  Bandwidth:  1.30GB/s
  Status codes: 2xx=3472585, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3472584 / 3472585 responses (100.0%)
  Reconnects: 138504
  Per-template: 692208,694275,696330,696408,693363
  Per-template-ok: 692208,694275,696330,696408,693363
[info] CPU 3405.0% | Mem 393MiB

[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   2.32ms    873us   6.17ms   17.10ms   29.10ms

  3583611 requests in 10.00s, 3583612 responses
  Throughput: 358.28K req/s
  Bandwidth:  1.34GB/s
  Status codes: 2xx=3583612, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3583593 / 3583612 responses (100.0%)
  Reconnects: 143416
  Per-template: 714620,716342,718289,718556,715786
  Per-template-ok: 714620,716342,718289,718556,715786
[info] CPU 2989.1% | Mem 403MiB

[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   2.40ms    891us   6.40ms   17.60ms   31.10ms

  3453460 requests in 10.00s, 3453458 responses
  Throughput: 345.26K req/s
  Bandwidth:  1.29GB/s
  Status codes: 2xx=3453458, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3453452 / 3453458 responses (100.0%)
  Reconnects: 138222
  Per-template: 688597,690720,692387,692367,689381
  Per-template-ok: 688597,690720,692387,692367,689381
[info] CPU 2903.8% | Mem 411MiB

=== Best: 358361 req/s (CPU: 2989.1%, Mem: 403MiB) ===
[info] input BW: 23.92MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/ioxide.json
httparena-bench-ioxide
httparena-bench-ioxide

==============================================
=== 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   5.58ms   2.09ms   16.00ms   28.70ms   45.10ms

  10414956 requests in 15.00s, 10414765 responses
  Throughput: 694.20K req/s
  Bandwidth:  194.50MB/s
  Status codes: 2xx=10414765, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 10414765 / 10414765 responses (100.0%)
  Reconnects: 50060
  Per-template: 516688,486631,487346,479462,472132,460023,452348,447280,454638,471489,490016,510873,534741,558892,583013,608548,622770,620181,593051,564643
  Per-template-ok: 516688,486631,487346,479462,472132,460023,452348,447280,454638,471489,490016,510873,534741,558892,583013,608548,622770,620181,593051,564643
[info] CPU 3154.2% | Mem 617MiB

[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.04ms   1.52ms   15.30ms   30.30ms   43.20ms

  11460026 requests in 15.00s, 11460025 responses
  Throughput: 763.88K req/s
  Bandwidth:  210.58MB/s
  Status codes: 2xx=11460025, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 11460007 / 11460025 responses (100.0%)
  Reconnects: 55405
  Per-template: 558905,538828,550078,558707,566017,559660,550605,541360,533295,534743,541025,550152,565084,583042,602663,626572,638904,637642,624598,598127
  Per-template-ok: 558905,538828,550078,558707,566017,559660,550605,541360,533295,534743,541025,550152,565084,583042,602663,626572,638904,637642,624598,598127
[info] CPU 3171.5% | Mem 721MiB

[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   4.70ms   1.05ms   14.60ms   29.60ms   43.00ms

  12152071 requests in 15.00s, 12152072 responses
  Throughput: 810.00K req/s
  Bandwidth:  221.37MB/s
  Status codes: 2xx=12152072, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12152072 / 12152072 responses (100.0%)
  Reconnects: 58810
  Per-template: 577514,566921,586433,597572,608345,616184,615451,608881,603993,594503,585536,586504,591091,603699,620632,639857,645952,648186,637987,616831
  Per-template-ok: 577514,566921,586433,597572,608345,616184,615451,608881,603993,594503,585536,586504,591091,603699,620632,639857,645952,648186,637987,616831
[info] CPU 3326.6% | Mem 680MiB

=== Best: 810138 req/s (CPU: 3326.6%, Mem: 680MiB) ===
[info] input BW: 69.53MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/ioxide.json
httparena-bench-ioxide
httparena-bench-ioxide
[info] skip: ioxide does not subscribe to fortunes
[info] skip: ioxide does not subscribe to baseline-h2
[info] skip: ioxide does not subscribe to static-h2
[info] skip: ioxide does not subscribe to baseline-h2c
[info] skip: ioxide does not subscribe to json-h2c
[info] skip: ioxide does not subscribe to baseline-h3
[info] skip: ioxide does not subscribe to static-h3
[info] skip: ioxide does not subscribe to gateway-64
[info] skip: ioxide does not subscribe to gateway-h3
[info] skip: ioxide does not subscribe to production-stack
[info] skip: ioxide does not subscribe to unary-grpc
[info] skip: ioxide does not subscribe to unary-grpc-tls
[info] skip: ioxide does not subscribe to stream-grpc
[info] skip: ioxide does not subscribe to stream-grpc-tls
[info] skip: ioxide does not subscribe to echo-ws
[info] skip: 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

<Features>runtime-async=on</Features> - compile the entry's async (the HTTP handle/send loop, the
ioxide.pg/redis awaits) to the runtime-managed model. Preview feature; net11 only.
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