Skip to content

[C#] GenHTTP: Compliant implementation of CRUD (with 200ms TTL)#630

Merged
MDA2AV merged 2 commits intoMDA2AV:mainfrom
Kaliumhexacyanoferrat:genhttp-compliant-crud
Apr 25, 2026
Merged

[C#] GenHTTP: Compliant implementation of CRUD (with 200ms TTL)#630
MDA2AV merged 2 commits intoMDA2AV:mainfrom
Kaliumhexacyanoferrat:genhttp-compliant-crud

Conversation

@Kaliumhexacyanoferrat
Copy link
Copy Markdown
Collaborator

Description


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

Command Description
/benchmark -f <framework> Run all benchmark tests
/benchmark -f <framework> -t <test> Run a specific test
/benchmark -f <framework> --save Run and save results (updates leaderboard on merge)

Always specify -f <framework>. Results are automatically compared against the current leaderboard.


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.

@Kaliumhexacyanoferrat Kaliumhexacyanoferrat self-assigned this Apr 24, 2026
@Kaliumhexacyanoferrat
Copy link
Copy Markdown
Collaborator Author

/benchmark -f genhttp -t crud --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 run triggered for genhttp (test: crud) with --save. Results will be posted here when done.

@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: genhttp | Test: crud

Test Conn RPS CPU Mem Δ RPS Δ Mem
crud 4096 484,308 4815.4% 1.1GiB -3.8% -26.7%
Full log
[info] crud experiment CPU layout: redis=0,64 | server=1-31,65-95 | gcannon=32-63,96-127 | postgres=unpinned
[info] available CPUs: 128
[info] framework: genhttp (genhttp, C#)
[info] subscribed tests: baseline,pipelined,limited-conn,json,json-comp,json-tls,upload,async-db,crud,static,echo-ws,api-4,api-16
[info] building image: httparena-genhttp
#0 building with "default" instance using docker driver

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 356B done
#1 DONE 0.0s

#2 [internal] load metadata for mcr.microsoft.com/dotnet/runtime:10.0
#2 DONE 0.0s

#3 [internal] load metadata for mcr.microsoft.com/dotnet/sdk:10.0
#3 DONE 0.3s

#4 [internal] load .dockerignore
#4 transferring context: 2B done
#4 DONE 0.0s

#5 [build 1/6] FROM mcr.microsoft.com/dotnet/sdk:10.0@sha256:8a90a473da5205a16979de99d2fc20975e922c68304f5c79d564e666dc3982fc
#5 resolve mcr.microsoft.com/dotnet/sdk:10.0@sha256:8a90a473da5205a16979de99d2fc20975e922c68304f5c79d564e666dc3982fc 0.1s done
#5 DONE 0.1s

#6 [stage-1 1/3] FROM mcr.microsoft.com/dotnet/runtime:10.0@sha256:8fb7ff015fcf0ebc6e90105bd6db06875954e6dc3d374b9dbb34c732867d13e4
#6 resolve mcr.microsoft.com/dotnet/runtime:10.0@sha256:8fb7ff015fcf0ebc6e90105bd6db06875954e6dc3d374b9dbb34c732867d13e4 0.1s done
#6 DONE 0.1s

#7 [internal] load build context
#7 transferring context: 537B done
#7 DONE 0.0s

#8 [build 6/6] RUN dotnet publish -c Release --no-self-contained -o /app
#8 CACHED

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

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

#11 [build 3/6] COPY genhttp.csproj ./
#11 CACHED

#12 [build 4/6] RUN dotnet restore
#12 CACHED

#13 [build 5/6] COPY . .
#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:35c84b6bf2b842208af490deb234afbe5bde439627701a6467fd7effe0180ed8 done
#15 exporting config sha256:dcf0c8c60751b366ddc471086d19fa42fd2f8b8a98bfe2e94012f35717f18204 done
#15 exporting attestation manifest sha256:f6dd1e63b5852b7dab45f3d4345db5ee606c2b4e90774cffa8aa867d8fb18fdc
#15 exporting attestation manifest sha256:f6dd1e63b5852b7dab45f3d4345db5ee606c2b4e90774cffa8aa867d8fb18fdc 0.0s done
#15 exporting manifest list sha256:a0d1a23995a69a1b7a6fb8d448bdc11534dcd6565133364dad81a22f95afccde 0.0s done
#15 naming to docker.io/library/httparena-genhttp:latest done
#15 unpacking to docker.io/library/httparena-genhttp: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
[info] starting postgres sidecar
[info] postgres ready (seeded)
[info] starting redis sidecar (cpuset=0,64)
[info] redis ready

==============================================
=== genhttp / crud / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.2
  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   10.61ms   10.60ms   24.80ms   38.50ms   52.50ms

  5473692 requests in 15.00s, 5470774 responses
  Throughput: 364.67K req/s
  Bandwidth:  138.49MB/s
  Status codes: 2xx=5470774, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 5470774 / 5470774 responses (100.0%)
  Reconnects: 25507
  Per-template: 166876,170706,202463,212823,244538,261035,284291,307506,323391,331088,332143,332007,332368,330288,331744,331897,311983,267969,215789,179869
  Per-template-ok: 166876,170706,202463,212823,244538,261035,284291,307506,323391,331088,332143,332007,332368,330288,331744,331897,311983,267969,215789,179869
[info] CPU 4992.0% | Mem 1.2GiB

[run 2/3]
gcannon v0.5.2
  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   8.01ms   9.69ms   16.30ms   28.30ms   35.00ms

  7266803 requests in 15.00s, 7264631 responses
  Throughput: 484.22K req/s
  Bandwidth:  184.45MB/s
  Status codes: 2xx=7264631, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 7264630 / 7264631 responses (100.0%)
  Reconnects: 34389
  Per-template: 277783,246338,256841,262864,290034,300565,328709,341692,373873,382741,419878,429770,444235,454565,455222,455937,437631,406098,371584,328270
  Per-template-ok: 277783,246338,256841,262864,290034,300565,328709,341692,373873,382741,419878,429770,444235,454565,455222,455937,437631,406098,371584,328270
[info] CPU 4815.4% | Mem 1.1GiB

[run 3/3]
gcannon v0.5.2
  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   8.05ms   9.83ms   15.20ms   27.80ms   39.00ms

  7224715 requests in 15.00s, 7222253 responses
  Throughput: 481.41K req/s
  Bandwidth:  183.60MB/s
  Status codes: 2xx=7222253, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 7222249 / 7222253 responses (100.0%)
  Reconnects: 34134
  Per-template: 269173,240326,257095,262178,291131,301516,330638,341994,375834,385452,419707,430243,440435,450238,451804,453648,435949,399647,363813,321428
  Per-template-ok: 269173,240326,257095,262178,291131,301516,330638,341994,375834,385452,419707,430243,440435,450238,451804,453648,435949,399647,363813,321428
[info] CPU 4790.6% | Mem 1.1GiB

=== Best: 484308 req/s (CPU: 4815.4%, Mem: 1.1GiB) ===
[info] input BW: 41.57MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/genhttp.json
httparena-bench-genhttp
httparena-bench-genhttp
[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/crud-4096.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
[info] restoring CPU governor → powersave

@Kaliumhexacyanoferrat Kaliumhexacyanoferrat marked this pull request as ready for review April 24, 2026 21:07
@MDA2AV MDA2AV merged commit bd97038 into MDA2AV:main Apr 25, 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