Cameleeringsimoom

simoom / Compare / may-minihttp vs simoom

Two servers built for throughput

may-minihttp vs simoom

may-minihttp is a minimal HTTP/1.1 server on the may stackful coroutine library, well known from benchmark tables. In benchmark campaign 4 (2026-11-12) it was the only server ahead of simoom on the status endpoint at 256 clients. Here is where it leads, and where simoom does.

11 of 19campaign 4 measures where simoom is ahead of may-minihttplevel on 1, behind on 7
6% more than simoomStatus endpoint, 256 clients: requests/s with 99% within 1 ms, against may-minihttpsimoom 145,171 req/s, may-minihttp 154,590 req/s
simoom 15% lowerCPU per request at a fixed 50,000 requests/s, against may-minihttpsimoom 24.3 µs, may-minihttp 28.6 µs
simoom 35x less10,000 idle connections: memory per connection, against may-minihttpsimoom 575 B, may-minihttp 20,293 B

may-minihttp and simoom at a glance

Wins and losses in one table. may-minihttp 0.1.11 from its pinned Cargo.lock, on the same DigitalOcean c-4 droplet as simoom in each round of campaign 4.

may-minihttpsimoom
Modelstackful coroutines (may)one event loop per CPU core; plain functions, no async
ProtocolsHTTP/1.1HTTP/1.1, HTTP/2, HTTP/3, TLS 1.3, WebSocket, server-sent events, a client
Status endpoint, 64 / 256 / 1,024 clients (req/s, 99% within 1 ms)158,598 / 154,590 / 155,048137,443 / 145,082 / 133,243 (may-minihttp 15% / 6% / 16% more)
JSON API, 1 KB in and out, 256 clients (req/s, 99% within 1 ms)131,427123,040 (may-minihttp 5% more)
p99 at a fixed 50,000 req/s400 µs355 µs
CPU per request at a fixed 50,000 req/s28.2 µs23.4 µs
Traffic spike at 195,000 req/s offered, answers within 1 ms4,811/s6,264/s
p99 of real requests under 11,000 slow attackers1,073 µs568 µs
Memory per connection, 10,000 idle connections20,293 B575 B
Peak memory while serving the status endpoint (PSS)28,936 KB2,924 KB
Start-up to first answer8.03 ms0.90 ms default build; 1.20 ms full server
Program size, stripped515 KB (HTTP/1.1 only)735 KB default build (HTTP/1.1, HTTP/2, WebSocket); 1,550 KB full server

Campaign 4, 2026-11-12: may-minihttp and simoom on the same droplet in the same rounds, median of rounds; simoom's figure is from those same runs. An HTTP/1.1-only simoom build was not part of campaign 4; its size budget is in features and size. Every measure: the benchmarks.

Every measure, head to head

measure (campaign 4)may-minihttp
Status endpoint, 64 clients: requests/s with 99% within 1 ms15% more than simoom158,598 req/s vs simoom 137,443 req/s
Status endpoint, 256 clients: requests/s with 99% within 1 ms6% more than simoom154,590 req/s vs simoom 145,171 req/s
Status endpoint, 1,024 clients: requests/s with 99% within 1 ms16% more than simoom155,048 req/s vs simoom 133,243 req/s
Latency at a fixed 50,000 requests/s (256 clients): p99simoom 11% lower400 µs vs simoom 356 µs
CPU per request at a fixed 50,000 requests/ssimoom 15% lower28.6 µs vs simoom 24.3 µs
JSON API, 1 KB in and out, 256 clients: requests/s with 99% within 1 ms5% more than simoom124,126 req/s vs simoom 118,427 req/s
A new connection per request, 192 clients: requests/s with 99% within 5 ms4% more than simoom23,052 req/s vs simoom 22,116 req/s
10,000 idle connections: memory per connectionsimoom 35x less20,293 B vs simoom 575 B
100,000 idle connections: memory per connectionsimoom 40x less21,035 B vs simoom 532 B
Traffic spike at 195,000 requests/s offered: answers within 1 ms per secondsimoom 30% more4,811 req/s vs simoom 6,264 req/s
Traffic spike: all answers per secondlevel159,107 req/s vs simoom 159,868 req/s
Under 11,000 slow attackers: p99 of real requestssimoom 47% lower1,073 µs vs simoom 568 µs
Start-up, process start to first answer: simoom's default build (HTTP/1.1, HTTP/2, WebSocket)simoom 8.9x faster8.03 ms vs simoom 0.90 ms
Start-up, process start to first answer: simoom's full server (also TLS 1.3 and HTTP/3)simoom 6.7x faster8.03 ms vs simoom 1.20 ms
Program size, stripped: simoom's default build (HTTP/1.1, HTTP/2, WebSocket)30% smaller than simoom515 KB vs simoom 735 KB
Program size, stripped: simoom's full server (also TLS 1.3 and HTTP/3)3.0x smaller than simoom515 KB vs simoom 1,550 KB
Memory at rest (PSS)simoom 5.0x less9,152 KB vs simoom 1,844 KB
Peak memory while serving the status endpoint (PSS)simoom 9.6x less28.3 MB vs simoom 3,008 KB
Peak memory while serving the JSON API (PSS)simoom 9.5x less29.2 MB vs simoom 3,129 KB

Each cell: simoom against that server on the same droplet in the same round, median of rounds, then the server's value against simoom's in the same runs. Every measure and every other server: the benchmarks.

An earlier round

An earlier campaign (campaign 3, 2026-11-11) ran before a fix that keeps simoom's event loops off the CPU busiest with network-card interrupts (bug K12 in the repository), and read differently. Campaign 4 supersedes it; its figures stay in bench/results/2026-11-11-campaign3/ and are not used on this site.

When to pick may-minihttp instead

Pick may-minihttp when

  • HTTP/1.1 is all you serve and you want the most requests per second: in campaign 4 it answered 6-16% more status requests than simoom, and its program is 515 KB against 735 KB for simoom's default build.
  • Your network path is unreliable: in an earlier campaign (2026-11-11) it held up best on a droplet with a degraded network path. Campaign 4 did not test that case.
  • You are comfortable with stackful coroutines. Whether they can be made fully sound in Rust is an open discussion; read it and decide for yourself.

Pick simoom when

  • You need HTTP/2, HTTP/3, TLS, WebSocket or a client in the same program.
  • CPU, latency or memory matter more than peak throughput: in campaign 4 simoom used 15% less CPU per request, held 35x less memory per idle connection and started 8.9x faster.
  • You want strict, bounded parsing: every limit has a default, h2spec 146/146, HTTP Garden with 0 desyncs.
  • You want blocking work handled for you: a bounded offload pool that answers 503 instead of queueing forever.
  • You want no third-party crates at all, and unsafe confined to one crate.

How it was measured

Setup

  • DigitalOcean c-4 droplets (4 dedicated vCPUs, Xeon Platinum 8280, Bangalore), Ubuntu 24.04.
  • One server droplet and two load droplets; open-loop load at fixed rates.
  • may-minihttp 0.1.11 from its pinned Cargo.lock.

Rules

  • Headline: the highest steady rate whose p99 stays at or under 1 ms.
  • Campaign 4, 2026-11-12: simoom ran on the same droplet in the same round as may-minihttp; every figure is the median of rounds.
  • Raw HDR logs, scripts and analyses are in bench/results/.

Benchmark method · the losses · binary size

Common questions

What is a good may-minihttp alternative?

If you like may-minihttp for its throughput without tokio but need more than HTTP/1.1, simoom covers HTTP/1.1, HTTP/2, HTTP/3, its own TLS 1.3, WebSocket and a client with no third-party crates. On the same droplet in benchmark campaign 4 (2026-11-12), may-minihttp answered 6% more status requests per second at 256 clients and its program is smaller (515 KB against 735 KB for simoom's default build), while simoom used 15% less CPU per request, started 8.9x faster and held 35x less memory per idle connection. If you want a framework on tokio instead, look at axum or xitca-web.

Is may-minihttp faster than simoom?

On plain throughput, yes. In benchmark campaign 4 (2026-11-12), with both servers on the same droplet in the same rounds, may-minihttp answered 15%, 6% and 16% more status requests per second than simoom at 64, 256 and 1,024 clients, and 5% more on the 1 KB JSON API. simoom had the lower p99 at a fixed 50,000 req/s (355 µs against 400 µs), used less CPU per request (23.4 µs against 28.2 µs) and answered 30% more requests within 1 ms during a traffic spike. may-minihttp's program is also smaller: 515 KB against 735 KB for simoom's default build.

What is the fastest Rust HTTP server?

There is no single answer: it changes with the machine, the number of connections and the test. In benchmark campaign 4 (2026-11-12), with each server on the same droplet as simoom, may-minihttp led the status endpoint at 256 clients with 154,590 req/s, 6% more than simoom; simoom came second of 19, 24% ahead of hyper. simoom was first of 19 on CPU per request and first of 8 on HTTPS throughput, H2O led HTTP/2 and HTTP/3, and actix-web led the traffic spike. Measure on your own hardware with your own traffic.

Does may-minihttp support HTTP/2 or TLS?

may-minihttp is a minimal HTTP/1.1 server, best known from benchmarks. simoom adds HTTP/2, HTTP/3 over QUIC, TLS 1.3, WebSocket and server-sent events as cargo features, and an HTTP/1.1-only build is available when that is all you need.

Quick start

For an HTTP/1.1-only build like may-minihttp's, turn simoom's default features off.

# Cargo.toml
simoom = { version = "0.1", default-features = false, features = ["http1"] }