kestrel
Engine · C#
Kestrel with nothing above it: one RequestDelegate reads the path and answers, with no routing middleware, no MVC, no endpoint mapping and no model binding. aspnet-minimal measures ASP.NET Core as people write it, so the distance between the two rows is what the framework layer costs rather than what the server costs. :8080 is HTTP/1.1, :8082 cleartext HTTP/2 by prior knowledge, :8081 HTTP/1.1 over TLS, and :8443 serves HTTP/1.1 and HTTP/2 over TCP plus HTTP/3 over QUIC on the same port. Static files are read off the mounted directory per request, with the precompressed sibling served when Accept-Encoding allows.
Composite rank
Each profile of a family is worth 100 to the entry that leads it, and the composite is the sum over the family, less 2.5% for each of routing, middleware, request and response the entry does not do for you - its completeness factor, which the WebSocket and gRPC families do not carry. The field is this entry's own league: engines and reverse proxies are scored apart from frameworks. How it works.
| Family | Rank | Composite |
|---|---|---|
| HTTP/1.1 | 14 of 21 | 2131 |
| HTTP/2 | 5 of 5 | 459 |
| HTTP/3 | 3 of 3 | 217 |
Every result
Alpha Round, 22 runs. Requests per second is the best of three; latency, CPU and memory come from that run.
| Category | Profile | Conns | Req/sec | Avg | p99 | CPU | Memory |
|---|---|---|---|---|---|---|---|
| Connection | Baseline | 4,096 | 1,320,795 | 2.66ms | 8.10ms | 5589.3% | 392MiB |
| Connection | Pipelined | 4,096 | 7,438,251 | 7.63ms | 18.80ms | 5678.4% | 321MiB |
| Connection | Short-lived | 4,096 | 455,508 | 1.65ms | 12.30ms | 3087.1% | 118MiB |
| Concurrency | Async Delay | 32,000 | 942,334 | 27.85ms | 58.70ms | 4582.5% | 1.5GiB |
| Efficiency | Latency-10K | 1,024 | 9,942 | 109.7us | 118.0us | 135.9% | 157MiB |
| Efficiency | Latency-1M | 1,024 | 997,526 | 501.1us | 4526.0us | 4940.5% | 181MiB |
| Workload | JSON Comp | 4,096 | 478,176 | 6.88ms | 28.30ms | 5888.7% | 525MiB |
| Workload | JSON Comp | 16,384 | 462,171 | 10.30ms | 34.30ms | 5974.0% | 590MiB |
| Workload | JSON TLS | 4,096 | 617,570 | 6.88ms | 125.79ms | 5842.0% | 795MiB |
| Workload | 8Gbit | 512 | 49,331 | 142.2us | 188.0us | 857.2% | 221MiB |
| Workload | Static TLS | 1,024 | 298,009 | 3.50ms | 36.16ms | 5903.0% | 406MiB |
| HTTP/2 | Baseline | 256 | 2,360,754 | 10.25ms | 61.63ms | 6089.9% | 1.0GiB |
| HTTP/2 | Baseline | 1,024 | 2,258,261 | 45.76ms | 197.35ms | 5968.6% | 3.9GiB |
| HTTP/2 | Static | 256 | 244,779 | 33.04ms | 177.80ms | 6060.8% | 949MiB |
| HTTP/2 | Static | 1,024 | 150,845 | 207.57ms | 1.11s | 5760.5% | 3.3GiB |
| HTTP/2 | Baseline (h2c) | 256 | 2,884,638 | 9.02ms | 50.01ms | 6057.2% | 941MiB |
| HTTP/2 | Baseline (h2c) | 1,024 | 2,763,350 | 38.84ms | 261.65ms | 6097.1% | 4.2GiB |
| HTTP/2 | Baseline (h2c) | 4,096 | 2,180,763 | 133.61ms | 574.75ms | 5714.2% | 8.1GiB |
| HTTP/2 | JSON (h2c) | 1,024 | 978,611 | 31.29ms | 256.39ms | 6281.3% | 1.4GiB |
| HTTP/2 | JSON (h2c) | 4,096 | 856,136 | 120.63ms | 644.75ms | 5963.2% | 4.2GiB |
| HTTP/3 | Baseline | 64 | 668,997 | 5.67ms | 18.07ms | 6180.8% | 1.9GiB |
| HTTP/3 | Static | 64 | 85,335 | 38.38ms | 214.65ms | 5959.1% | 1.1GiB |
Compared with
The C# entries around kestrel on the HTTP/1.1 composite, and the one leading them. The last column shows every profile side by side.
| Entry | Composite | vs kestrel | |
|---|---|---|---|
| genhttp-ioxide | 6118 | +187% | head to head |
| aspnet-minimal | 2724 | +28% | head to head |
| fastendpoints | 2669 | +25% | head to head |
| sisk | 2055 | -4% | head to head |
| cadente | 1731 | -19% | head to head |
Compare kestrel with any C# entry · Compare kestrel with any entry, in any language · Every C# entry, ranked
Results updated · How the benchmark is run · The machine · Add or fix an entry