Skirr prototype: local HTTP/1 comparison

One worker pinned to CPU 0; wrk on CPUs 4-7; identical apps and Python.
Access logs, request IDs, compression, caches and lifespan disabled.
Server allocator/GC defaults retained; Skirr does not alter application GC policy.
Medians of repeated runs; counts, duration and warmup are recorded per matrix.
Temporary performance-profile hold for final matrices; CPU clocks sampled per run.
No TLS, HTTP/2, WebSockets or pipelining in the throughput workload.
Exact body/status checked before/after each run, not on every wrk response.
P99 below is median per-run wrk P99, not a pooled percentile.
Timeout semantics follow the recorded generator; all counters are retained.
These measurements do not establish production readiness or general superiority.

Connections: 64; repeats: 5; duration: 8s; warmup: 1s; offered rate: unlimited
Power profile: performance
Versions: {"fastapi": "0.143.1", "peregrine-server": "1.1.7", "uvloop": "0.23.0", "weft-server": "0.1.0"}
Workload          Server          Req/s     P99 ms   IO failures  Timeouts  HTTP errors   PSS MiB   RPS range   P99 range ms
fastapi_json      peregrine         25,913       4.13           0     0             0      55.1 25,045-26,219   3.54-4.77
fastapi_json      skirr             24,972       4.15           0     0             0      38.0 24,655-25,723   4.01-4.68
fastapi_json      skirr-before      24,607       5.23           0     0             0      38.0 24,194-24,938   5.06-5.39

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4496; 4187-4700
skirr         4515; 4200-4700
skirr-before  4526; 4179-4700

Optimized Skirr change versus same-session saved baseline:
fastapi_json      +1.5%; versus Peregrine -3.6%

Raw artifact: bench/results/fastapi-round3-c64/results.json

Connections: 256; repeats: 5; duration: 8s; warmup: 1s; offered rate: unlimited
Power profile: performance
Versions: {"fastapi": "0.143.1", "peregrine-server": "1.1.7", "uvloop": "0.23.0", "weft-server": "0.1.0"}
Workload          Server          Req/s     P99 ms   IO failures  Timeouts  HTTP errors   PSS MiB   RPS range   P99 range ms
fastapi_json      peregrine         25,997      14.25           0     0             0      56.3 25,274-26,446   12.90-16.99
fastapi_json      skirr             24,962      16.03           0     0             0      38.1 24,712-25,152   15.44-17.44
fastapi_json      skirr-before      24,730      16.33           0     0             0      38.1 24,032-24,803   15.46-17.22

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4381; 398-4700
skirr         4441; 400-4700
skirr-before  4422; 400-4700

Optimized Skirr change versus same-session saved baseline:
fastapi_json      +0.9%; versus Peregrine -4.0%

Raw artifact: bench/results/fastapi-round3-c256/results.json

Connections: 64; repeats: 3; duration: 5s; warmup: 1s; offered rate: unlimited
Power profile: performance
Versions: {"fastapi": "0.143.1", "peregrine-server": "1.1.7", "uvloop": "0.23.0", "weft-server": "0.1.0"}
Workload          Server          Req/s     P99 ms   IO failures  Timeouts  HTTP errors   PSS MiB   RPS range   P99 range ms
get_64k           peregrine         73,523       1.64           0     0             0      32.7 72,847-73,924   1.54-1.69
get_64k           skirr             84,124       1.44           0     0             0      17.1 82,845-84,302   1.38-2.48
get_64k           skirr-before      84,006       1.53           0     0             0      17.1 84,002-84,397   1.50-1.55
post_4k           peregrine        166,776       1.44           0     0             0      33.5 163,033-167,248   0.99-1.65
post_4k           skirr            170,313       1.03           0     0             0      17.2 168,357-170,405   0.64-1.65
post_4k           skirr-before     161,472       1.38           0     0             0      17.2 160,251-163,362   0.88-1.41
raw_get           peregrine        207,913       1.21           0     0             0      32.7 202,505-208,346   0.83-1.56
raw_get           skirr            221,271       0.74           0     0             0      17.1 214,622-222,484   0.42-1.95
raw_get           skirr-before     214,414       0.93           0     0             0      17.2 212,993-214,583   0.60-1.53

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4442; 4200-4700
skirr         4502; 4200-4701
skirr-before  4477; 4200-4700

Optimized Skirr change versus same-session saved baseline:
get_64k           +0.1%; versus Peregrine +14.4%
post_4k           +5.5%; versus Peregrine +2.1%
raw_get           +3.2%; versus Peregrine +6.4%

Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr      first-byte 0.372ms; total 50.515ms
peregrine  first-byte 0.455ms; total 50.759ms
skirr-before first-byte 0.444ms; total 50.678ms

Raw artifact: bench/results/fastapi-round3-controls-c64/results.json

Connections: 256; repeats: 3; duration: 5s; warmup: 1s; offered rate: unlimited
Power profile: performance
Versions: {"fastapi": "0.143.1", "peregrine-server": "1.1.7", "uvloop": "0.23.0", "weft-server": "0.1.0"}
Workload          Server          Req/s     P99 ms   IO failures  Timeouts  HTTP errors   PSS MiB   RPS range   P99 range ms
get_64k           peregrine         71,315       6.26           0     0             0      34.9 70,103-72,012   6.20-6.78
get_64k           skirr             80,735       5.95           0     0             0      17.2 80,379-81,079   5.15-6.33
get_64k           skirr-before      79,694       6.32           0     0             0      17.2 79,171-80,218   5.19-6.35
post_4k           peregrine        158,854       2.84           0     0             0      38.7 158,372-159,288   2.65-3.00
post_4k           skirr            162,714       2.55           0     0             0      18.1 162,046-163,526   2.28-2.71
post_4k           skirr-before     160,500       2.77           0     0             0      18.1 155,495-163,462   2.31-3.23
raw_get           peregrine        207,013       2.25           0     0             0      33.8 205,337-208,601   2.21-2.45
raw_get           skirr            212,972       3.08           0     0             0      17.2 205,560-217,713   2.95-3.62
raw_get           skirr-before     213,686       2.10           0     0             0      17.2 210,282-214,456   1.86-2.89

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4263; 398-4700
skirr         4394; 399-4700
skirr-before  4301; 400-4700

Optimized Skirr change versus same-session saved baseline:
get_64k           +1.3%; versus Peregrine +13.2%
post_4k           +1.4%; versus Peregrine +2.4%
raw_get           -0.3%; versus Peregrine +2.9%

Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr      first-byte 0.518ms; total 50.708ms
peregrine  first-byte 0.325ms; total 50.565ms
skirr-before first-byte 0.507ms; total 50.592ms

Raw artifact: bench/results/fastapi-round3-controls-c256/results.json

Total completed requests across these comparisons: 47,395,587

wrk histogram counter behavior: https://github.com/wg/wrk/blob/4.1.0/src/wrk.c#L301-L325
wrk2 corrected fixed-rate histograms: https://github.com/giltene/wrk2/tree/44a94c17d8e6a0bac8559b53da76848e430cb7a7