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 and response caches disabled; lifespan recorded per matrix.
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; lifespan: off
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,820       3.73           0     0             0      55.2 25,740-25,944   3.56-4.02
fastapi_json      skirr             25,897       3.93           0     0             0      37.9 25,770-26,000   3.72-4.54
fastapi_json      skirr-before      25,041       3.61           0     0             0      37.9 24,898-25,090   3.01-4.89

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4483; 4200-4700
skirr         4505; 4200-4700
skirr-before  4503; 4200-4700

Optimized Skirr change versus same-session saved baseline:
fastapi_json      +3.4%; versus Peregrine +0.3%

Raw artifact: bench/results/latency-round4-final-c64/results.json

Connections: 256; repeats: 5; duration: 8s; warmup: 1s; offered rate: unlimited; lifespan: off
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         26,322      16.34           0     0             0      56.3 25,989-26,394   11.80-18.19
fastapi_json      skirr             25,716      14.38           0     0             0      37.9 25,472-26,058   14.09-16.68
fastapi_json      skirr-before      24,936      15.35           0     0             0      38.0 24,649-25,276   15.14-15.85

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4392; 399-4700
skirr         4409; 399-4700
skirr-before  4413; 400-4700

Optimized Skirr change versus same-session saved baseline:
fastapi_json      +3.1%; versus Peregrine -2.3%

Raw artifact: bench/results/latency-round4-final-c256/results.json

Connections: 64; repeats: 3; duration: 5s; warmup: 1s; offered rate: unlimited; lifespan: off
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
post_4k           peregrine        168,097       0.81           0     0             0      33.5 166,822-169,571   0.71-0.87
post_4k           skirr            177,582       0.61           0     0             0      17.2 177,320-182,062   0.57-0.66
post_4k           skirr-before     170,837       0.79           0     0             0      17.2 168,542-171,581   0.61-0.94
raw_get           peregrine        206,398       0.66           0     0             0      32.6 205,568-207,784   0.59-0.76
raw_get           skirr            225,310       0.56           0     0             0      17.2 224,678-228,404   0.51-0.77
raw_get           skirr-before     219,191       0.56           0     0             0      17.1 218,013-219,963   0.52-0.66

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4475; 4200-4700
skirr         4525; 4200-4700
skirr-before  4471; 4200-4700

Optimized Skirr change versus same-session saved baseline:
post_4k           +3.9%; versus Peregrine +5.6%
raw_get           +2.8%; versus Peregrine +9.2%

Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr      first-byte 0.531ms; total 50.669ms
peregrine  first-byte 0.437ms; total 50.627ms
skirr-before first-byte 0.602ms; total 50.772ms

Raw artifact: bench/results/latency-round4-final-controls-c64/results.json

Connections: 256; repeats: 3; duration: 5s; warmup: 1s; offered rate: unlimited; lifespan: off
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
post_4k           peregrine        158,892       2.66           0     0             0      38.6 158,279-160,054   2.60-2.72
post_4k           skirr            169,572       2.49           0     0             0      18.1 169,558-170,261   2.33-2.71
post_4k           skirr-before     161,667       2.67           0     0             0      18.1 161,359-164,768   2.57-3.39
raw_get           peregrine        208,353       2.48           0     0             0      33.6 207,159-208,768   2.19-3.45
raw_get           skirr            224,803       1.95           0     0             0      18.1 219,260-226,137   1.43-3.45
raw_get           skirr-before     219,102       1.85           0     0             0      17.1 218,166-219,392   1.77-1.95

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4356; 400-4665
skirr         4461; 400-4700
skirr-before  4365; 400-4700

Optimized Skirr change versus same-session saved baseline:
post_4k           +4.9%; versus Peregrine +6.7%
raw_get           +2.6%; versus Peregrine +7.9%

Streaming: app waits 50ms after the first chunk; 20 sequential samples.
skirr      first-byte 0.624ms; total 50.643ms
peregrine  first-byte 0.621ms; total 50.790ms
skirr-before first-byte 0.510ms; total 50.605ms

Raw artifact: bench/results/latency-round4-final-controls-c256/results.json

Connections: 64; repeats: 3; duration: 8s; warmup: 1s; offered rate: unlimited; lifespan: on
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,850       3.98           0     0             0      55.2 25,746-25,971   3.47-4.33
fastapi_json      skirr             25,693       3.73           0     0             0      37.9 25,659-25,818   3.71-4.39
fastapi_json      skirr-before      25,226       3.60           0     0             0      37.9 25,084-25,407   3.59-3.69

Sampled server CPU clocks (MHz; median per-run mean, full observed range):
peregrine     4466; 4200-4700
skirr         4464; 4200-4675
skirr-before  4495; 4200-4700

Optimized Skirr change versus same-session saved baseline:
fastapi_json      +1.9%; versus Peregrine -0.6%

Raw artifact: bench/results/latency-round4-final-life-on/results.json

Total completed requests across these comparisons: 43,138,827

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
