vanilla-epoll
Engine · V · engine: epoll
vanilla is a minimalist, high-performance HTTP server written in V: multi-threaded, non-blocking epoll I/O, lock-free, copy-free, SO_REUSEPORT. Handlers are pure (request)->[]u8 returning raw response bytes. JSON is built in a single allocation with precomputed prefixes (no per-request reflection); json-comp gzips on Accept-Encoding; json-tls terminates TLS 1.3 (Mbed TLS 4) on :8081 with ALPN http/1.1, reusing the same allocation-free /json serializer; static-tls serves the 20 /static files on :8081 through vanilla's static_assets (br/gzip negotiation; snapshots re-checked against the disk, so a replaced file is served at once), sending bodies of 16 KiB or more with sendfile(2) over kTLS; fortunes renders the DB rows + a runtime row with HTML escaping; async-db/crud/fortunes use the native async pg_async driver with per-worker pipelined pools. Pinned V master (built from source, bootstrap pinned). async parks each /delay/{ms} on a one-shot timerfd from a per-worker free-list and answers only once it reports an expiration; 8gbit echoes the POST body on the :8081 TLS listener (Content-Length or chunked, per-worker dechunk buffer); production-stack's /api cache-aside (X-Cache MISS/HIT, 1 s items / 30 s users TTL, invalidated on write) runs in-process — no Redis required. One worker per CPU of the container's cpuset.
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 | 6 of 37 | 5642 |
| Gateway | 1 of 2 | 2982 |
Every result
Alpha Round, 20 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 | 4,117,078 | 994us | 1.08ms | 6222.4% | 128MiB |
| Connection | Pipelined | 4,096 | 40,088,672 | 1.63ms | 1.84ms | 6369.8% | 134MiB |
| Connection | Short-lived | 4,096 | 1,045,265 | 3.89ms | 40.30ms | 2938.2% | 83MiB |
| Concurrency | Async Delay | 32,000 | 2,597,329 | 12.22ms | 12.70ms | 6180.4% | 1.3GiB |
| Efficiency | Latency-10K | 1,024 | 9,981 | 70.7us | 96.0us | 21.2% | 58MiB |
| Efficiency | Latency-1M | 1,024 | 997,951 | 93.3us | 162.0us | 2133.2% | 62MiB |
| Efficiency | Latency-500K/8 | 1,024 | 498,816 | 806.9us | 8364.0us | 757.2% | 39MiB |
| Workload | JSON Comp | 4,096 | 2,530,892 | 1.38ms | 33.00ms | 5721.8% | 150MiB |
| Workload | JSON Comp | 16,384 | 2,503,125 | 6.19ms | 159.70ms | 5697.4% | 218MiB |
| Workload | JSON TLS | 4,096 | 1,609,881 | 13.83ms | 759.35ms | 5607.2% | 307MiB |
| Workload | 8Gbit | 512 | 49,158 | 287.9us | 238.0us | 512.6% | 86MiB |
| Workload | Static TLS | 1,024 | 1,104,765 | 1.52ms | 182.98ms | 6230.5% | 112MiB |
| Database | Async DB | 1,024 | 345,636 | 1.38ms | 8.87ms | 2972.1% | 120MiB |
| Database | Fortunes | 1,024 | 185,540 | 4.05ms | 7.93ms | 6269.5% | 233MiB |
| Gateway | Gateway (H2) | 512 | 380,490 | 49.37ms | 264.91ms | 5079.6% | 1.7GiB |
| Gateway | Gateway (H2) | 1,024 | 383,090 | 86.71ms | 564.50ms | 5258.6% | 2.3GiB |
| Gateway | Gateway (H3) | 64 | 92,115 | 22.11ms | 81.94ms | 2748.1% | 532MiB |
| Gateway | Gateway (H3) | 256 | 62,102 | 128.11ms | 759.12ms | 2123.9% | 1.5GiB |
| Gateway | Production Stack | 256 | 241,873 | 20.25ms | 115.42ms | 3838.9% | 1.2GiB |
| Gateway | Production Stack | 1,024 | 198,023 | 83.11ms | 475.44ms | 3420.9% | 2.1GiB |
Compared with
The V entries around vanilla-epoll on the HTTP/1.1 composite, and the one leading them. The last column shows every profile side by side.
| Entry | Composite | vs vanilla-epoll | |
|---|---|---|---|
| vanilla-io_uring | 6279 | +11% | head to head |
Compare vanilla-epoll with any V entry · Compare vanilla-epoll with any entry, in any language · Every V entry, ranked
Results updated · How the benchmark is run · The machine · Add or fix an entry