Skip to content

[C#] GenHTTP (Kestrel): Implement CRUD and improve static files implementation#663

Merged
MDA2AV merged 2 commits intoMDA2AV:mainfrom
Kaliumhexacyanoferrat:genhttp-kestrel-10.5.1
Apr 27, 2026
Merged

[C#] GenHTTP (Kestrel): Implement CRUD and improve static files implementation#663
MDA2AV merged 2 commits intoMDA2AV:mainfrom
Kaliumhexacyanoferrat:genhttp-kestrel-10.5.1

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 27, 2026
@Kaliumhexacyanoferrat
Copy link
Copy Markdown
Collaborator Author

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

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,044,040 4866.7% 202MiB -4.0% -7.8%
baseline 4096 1,120,402 5467.5% 346MiB ~0% +3.0%
pipelined 512 3,133,552 5553.6% 153MiB -13.6% +3.4%
pipelined 4096 3,542,709 5930.5% 295MiB +2.5% -21.8%
limited-conn 512 439,883 3515.6% 132MiB -0.7% -4.3%
limited-conn 4096 450,665 3646.8% 146MiB +3.3% +9.0%
json 4096 589,491 5855.0% 513MiB -0.4% +2.2%
json-comp 512 386,099 5554.1% 252MiB -0.4% -21.2%
json-comp 4096 383,915 5992.4% 522MiB +2.0% -5.4%
json-comp 16384 376,125 6122.4% 650MiB +0.1% +1.7%
json-tls 4096 513,804 6103.7% 814MiB -0.4% +2.9%
upload 32 1,267 6045.7% 158MiB -1.6% -2.5%
upload 256 1,534 6390.3% 322MiB +0.3% -3.6%
api-4 256 43,632 372.3% 141MiB -3.3% +1.4%
api-16 1024 110,447 1491.1% 261MiB -1.3% +27.9%
static 1024 242,975 5855.8% 270MiB +86.8% -22.6%
static 4096 231,233 5918.9% 497MiB +56.2% -45.1%
static 6800 226,395 5947.2% 592MiB +44.7% -55.5%
async-db 1024 165,159 3705.7% 411MiB -0.4% +4.1%
crud 4096 452,652 4735.0% 617MiB NEW NEW
baseline-h2 256 1,792,309 6233.3% 1.2GiB -1.5% +22.6%
baseline-h2 1024 1,676,367 5976.5% 4.4GiB +1.3% +15.8%
static-h2 256 161,502 6210.9% 714MiB +104.3% -70.9%
static-h2 1024 156,461 6142.4% 2.0GiB +113.6% -72.6%
baseline-h3 64 627,428 6208.9% 1.7GiB +0.6% -5.6%
static-h3 64 110,183 6325.0% 1.2GiB +274.5% -47.8%
Full log
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      405us     64.27ms      5.23ms    11.65ms    24.12ms     6.03ms      3.68ms    87.57%
connect     :     3.89ms     35.38ms      8.05ms    33.49ms    35.38ms    12.74ms      9.83ms    79.69%
TTFB        :     5.59ms     66.84ms     27.16ms    60.91ms    66.84ms    27.50ms     18.90ms    59.38%
req/s       :    8626.71    11089.30     9460.30   10801.36   11089.30    9656.22      632.61    68.75%
min RTT     :       13us        82us        48us       60us       82us       46us        11us    76.56%
smoothed RTT:      208us       947us       501us      841us      947us      524us       171us    59.38%
packets sent:       6941       13672        9208      12683      13672    9798.84     1772.81    65.63%
packets recv:      12844       25081       17631      24395      25081   18427.02     3433.53    65.63%
packets lost:          0         197         112        163        197     103.94       44.39    71.88%
GRO packets :          1           1           1          1          1       1.00        0.00   100.00%
[info] CPU 6172.1% | Mem 1.3GiB

[run 3/3]
starting benchmark...
.
11Warm-up phase is over for thread #.9
.
.
TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3

finished in 5.01s, 628353.40 req/s, 62.35MB/s
requests: 3141767 total, 3145863 started, 3141767 done, 3141767 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 3143417 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 311.77MB (326915880) total, 293.78MB (308054866) headers (space savings 27.41%), 3.00MB (3143417) data
UDP datagram: 626060 sent, 1178181 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      550us     62.16ms      5.25ms    11.39ms    18.43ms     5.90ms      3.15ms    83.64%
connect     :     2.02ms     51.99ms      9.85ms    46.58ms    51.99ms    14.50ms     11.98ms    87.50%
TTFB        :     5.34ms     60.44ms     32.13ms    56.83ms    60.44ms    27.50ms     18.35ms    54.69%
req/s       :    7607.76    11938.38     9830.42   11370.30   11938.38    9816.92     1057.32    67.19%
min RTT     :       14us        95us        51us       92us       95us       53us        17us    71.88%
smoothed RTT:      200us      1.69ms       636us     1.49ms     1.69ms      746us       365us    68.75%
packets sent:       5490       14265        9392      13770      14265    9784.19     2676.72    46.88%
packets recv:      10080       25875       17961      25475      25875   18410.08     5213.16    40.63%
packets lost:          0         232         128        206        232     122.94       53.70    68.75%
GRO packets :          1           1           1          1          1       1.00        0.00   100.00%
[info] CPU 6208.9% | Mem 1.7GiB

=== Best: 627428 req/s (CPU: 6208.9%, Mem: 1.7GiB) ===
[info] saved results/baseline-h3/64/genhttp-kestrel.json
httparena-bench-genhttp-kestrel
httparena-bench-genhttp-kestrel

==============================================
=== genhttp-kestrel / static-h3 / 64c (tool=h2load-h3) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
starting benchmark...
57.
.

TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3

finished in 5.01s, 57496.20 req/s, 1.00GB/s
requests: 287481 total, 291577 started, 287481 done, 287366 succeeded, 115 failed, 0 errored, 0 timeout
status codes: 288220 2xx, 0 3xx, 0 4xx, 115 5xx
traffic: 5.01GB (5382779251) total, 27.12MB (28433975) headers (space savings 38.46%), 4.98GB (5351727802) data
UDP datagram: 1269765 sent, 3972801 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      348us    638.31ms     19.39ms   234.68ms   360.25ms    55.46ms     80.39ms    86.19%
connect     :   970.04ms       1.05s    987.58ms      1.03s      1.05s   996.00ms     19.41ms    76.56%
TTFB        :      1.08s       1.25s       1.22s      1.24s      1.25s      1.20s     51.64ms    81.25%
req/s       :     398.77     1184.28      936.61    1167.18    1184.28     898.29      241.69    53.13%
min RTT     :       13us       278us        55us      133us      278us       62us        44us    85.94%
smoothed RTT:      151us      8.70ms      1.51ms     6.02ms     8.70ms     1.85ms      1.77ms    85.94%
packets sent:       7803       31231       19087      30009      31231   19842.08     6843.26    54.69%
packets recv:      26382       85744       64027      83737      85744   62076.02    18238.13    53.13%
packets lost:          0         417          62        324        417     121.31      115.23    68.75%
GRO packets :          1           1           1          1          1       1.00        0.00   100.00%
[info] CPU 6088.8% | Mem 1.0GiB

[run 2/3]
starting benchmark...

12.
37.

22.
TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3
43. Stopping all clients.

finished in 5.01s, 110226.20 req/s, 1.94GB/s
requests: 551131 total, 555227 started, 551131 done, 551131 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 552019 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 9.69GB (10401677262) total, 51.92MB (54439030) headers (space savings 38.46%), 9.63GB (10342103400) data
UDP datagram: 2144010 sent, 7522354 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      257us    567.74ms     12.60ms   150.16ms   364.14ms    36.05ms     65.70ms    91.26%
connect     :     3.57ms     35.47ms     10.49ms    30.12ms    35.47ms    13.91ms      8.18ms    71.88%
TTFB        :     6.16ms     79.19ms     22.32ms    55.35ms    79.19ms    28.06ms     17.68ms    75.00%
req/s       :     746.77     2486.12     1794.72    2411.16    2486.12    1722.11      513.45    65.63%
min RTT     :       12us       256us        63us      226us      256us       72us        56us    78.13%
smoothed RTT:      163us      3.95ms       966us     3.30ms     3.95ms     1.20ms       885us    76.56%
packets sent:      13616       56739       32948      51395      56739   33502.16    11964.56    64.06%
packets recv:      49322      175581      121056     169520     175581  117537.78    37505.37    65.63%
packets lost:          0         765         146        699        765     214.92      242.29    78.13%
GRO packets :          1           1           1          1          1       1.00        0.00   100.00%
[info] CPU 6325.0% | Mem 1.2GiB

[run 3/3]
starting benchmark...

.



TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3

finished in 5.01s, 22703.20 req/s, 401.32MB/s
requests: 113516 total, 117612 started, 113516 done, 113516 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 117134 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 1.96GB (2104085948) total, 11.01MB (11548005) headers (space savings 38.50%), 1.95GB (2091526012) data
UDP datagram: 497506 sent, 1624359 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      206us       2.43s     12.76ms      1.04s      1.96s   128.20ms    371.90ms    93.16%
connect     :   866.00ms    878.67ms    875.86ms   878.42ms   878.67ms   875.15ms      2.63ms    65.63%
TTFB        :      1.86s       1.89s       1.88s      1.89s      1.89s      1.88s      8.06ms    56.25%
req/s       :     302.95      371.17      359.28     370.39     371.17     354.70       16.97    93.75%
min RTT     :       13us        47us        38us       45us       47us       34us        10us    65.63%
smoothed RTT:      142us       780us       277us      531us      780us      302us       119us    71.88%
packets sent:       4907        9724        8320       9647       9724    7775.53     1344.16    64.06%
packets recv:      20532       27430       25802      27296      27430   25381.59     1831.33    71.88%
packets lost:          0          55           6         40         55      13.08       13.94    84.38%
GRO packets :          1           1           1          1          1       1.00        0.00   100.00%
[info] CPU 1503.9% | Mem 1.6GiB

=== Best: 110183 req/s (CPU: 6325.0%, Mem: 1.2GiB) ===
[info] saved results/static-h3/64/genhttp-kestrel.json
httparena-bench-genhttp-kestrel
httparena-bench-genhttp-kestrel
[info] skip: genhttp-kestrel does not subscribe to gateway-64
[info] skip: genhttp-kestrel does not subscribe to gateway-h3
[info] skip: genhttp-kestrel does not subscribe to production-stack
[info] skip: genhttp-kestrel does not subscribe to unary-grpc
[info] skip: genhttp-kestrel does not subscribe to unary-grpc-tls
[info] skip: genhttp-kestrel does not subscribe to stream-grpc
[info] skip: genhttp-kestrel does not subscribe to stream-grpc-tls
[info] skip: genhttp-kestrel does not subscribe to echo-ws
[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/baseline-h2-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h3-64.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/static-h2-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-h2-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-h3-64.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
[info] restoring CPU governor → powersave

@Kaliumhexacyanoferrat Kaliumhexacyanoferrat marked this pull request as ready for review April 27, 2026 14:11
@MDA2AV MDA2AV merged commit 66181ae into MDA2AV:main Apr 27, 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