New commits, fourneau 2b5008c, fourneau-dragrace 4affaa2, roux b1d53e7: they race tonight at 03:00 New York time.

Race 2026-10-07T111620Z-cloud 2026-10-07 11:16 UTC took 52 min · $0.29 fourneau c2d9236 roux 8e6ebf3 dragrace 53d749d

What a $4 droplet can do

server
s-1vcpu-512mb-10gb · 1 vCPU · DO-Regular · Linux 7.0.0-31-generic
loader
c-4 · 4 vCPUs · Intel(R) Xeon(R) Platinum 8358 CPU @ 2.60GHz · Linux 7.0.0-31-generic

this class's data, as the page draws it

PlaintextGET /plaintext answers 13 bytes over kept-alive connections: the cost of HTTP itself.
fourneau-zig102,004
roux84,530
axum39,894
go22,501
basic-webserver14,383
table
competitorreq/s (median)p95 msp99 msp99.9 msroundsspread %server CPU %loader CPU %Mbit/s in / outlimited bysteal %peak RSS
fourneau-zig102,0043.754.275.49102,004 · 99,397 · 110,10010.5100.050.4125 / 160server CPU0.1112.7 MiB
roux84,5304.545.396.3285,018 · 76,793 · 84,5309.799.239.9104 / 133server CPU0.1110.2 MiB
axum39,8947.948.5310.3042,597 · 39,894 · 39,6127.5100.029.249 / 63server CPU0.114.9 MiB
go22,50118.2222.0328.0322,501 · 22,273 · 23,4575.3100.016.428 / 35server CPU0.222.6 MiB
basic-webserver14,38323.2625.6528.6514,396 · 14,383 · 12,68011.9100.011.118 / 23server CPU0.025.7 MiB
Echo 4 KiBPOST /echo with a 4 KiB body, answered with the same bytes: reading bodies and writing larger responses.
fourneau-zig33,359
roux32,007
axum21,698
go12,344
basic-webserver9,525
table
competitorreq/s (median)p95 msp99 msp99.9 msroundsspread %server CPU %loader CPU %Mbit/s in / outlimited bysteal %peak RSS
fourneau-zig33,35910.0612.0017.5235,664 · 33,336 · 33,3597.0100.029.11,237 / 1,179server CPU, network0.4112.7 MiB
roux32,00710.3411.8118.5833,985 · 28,080 · 32,00718.5100.026.01,194 / 1,128server CPU0.2110.2 MiB
axum21,69814.5316.3719.3223,404 · 21,688 · 21,6987.999.727.5836 / 767server CPU0.214.9 MiB
go12,34432.5040.1946.3212,427 · 12,235 · 12,3441.6100.019.9488 / 443server CPU0.122.6 MiB
basic-webserver9,52533.4936.3141.5411,048 · 9,525 · 9,33318.0100.013.5343 / 336server CPU0.230.7 MiB
TemplatesGET /menu renders a 12-row HTML table from a template per request, every value escaped: the work of a server-rendered page.
fourneau-zig67,616
roux50,193
axum37,370
go10,148
basic-webserver4,505
table
competitorreq/s (median)p95 msp99 msp99.9 msroundsspread %server CPU %loader CPU %Mbit/s in / outlimited bysteal %peak RSS
fourneau-zig67,6165.125.888.5273,961 · 58,017 · 67,61623.699.635.080 / 500server CPU0.2112.7 MiB
roux50,1937.128.0712.3655,276 · 50,193 · 45,08920.3100.025.759 / 372server CPU0.1110.2 MiB
axum37,3708.829.8411.4837,370 · 38,150 · 35,2987.6100.026.244 / 279server CPU0.114.9 MiB
go10,14842.2448.7255.299,676 · 10,599 · 10,1489.1100.07.812 / 76server CPU0.122.6 MiB
basic-webserver4,50569.9775.1383.015,001 · 4,505 · 4,42112.9100.04.95 / 36server CPU0.130.7 MiB
SSE (Datastar)GET /sse with Datastar's signals in the query, answered with a stream of ten Datastar events, a chunk each: the work of a Datastar action.
fourneau-zig63,961
roux28,347
axum27,929
go8,354
basic-webserver1,897
table
competitorreq/s (median)p95 msp99 msp99.9 msroundsspread %server CPU %loader CPU %Mbit/s in / outlimited bysteal %peak RSS
fourneau-zig63,9615.736.458.1771,183 · 57,679 · 63,96121.1100.045.692 / 645server CPU0.1112.7 MiB
roux28,34711.7713.0614.9228,347 · 29,040 · 27,6634.9100.021.741 / 286server CPU0.2110.2 MiB
axum27,92910.8912.1013.3330,096 · 27,929 · 27,7788.3100.031.240 / 282server CPU0.114.6 MiB
go8,35448.6156.9769.088,052 · 8,354 · 8,90310.2100.017.420 / 106server CPU0.122.1 MiB
basic-webserver1,897170.21193.36227.092,159 · 1,890 · 1,89714.2100.010.38 / 30server CPU0.330.9 MiB
Connection churnGET /plaintext on a new connection every request: accepting, and closing, as fast as possible.
fourneau-zig16,113
roux15,573
axum9,704
go7,754
basic-webserver5,004
table
competitorreq/s (median)p95 msp99 msp99.9 msroundsspread %server CPU %loader CPU %Mbit/s in / outlimited bysteal %peak RSS
fourneau-zig16,1136.158.2810.6916,113 · 15,089 · 16,2737.488.541.763 / 62connections (nothing saturated)0.2112.7 MiB
roux15,5736.017.3710.5515,666 · 15,573 · 15,4581.392.940.661 / 60server CPU0.1110.2 MiB
axum9,70410.3012.0314.4710,744 · 9,401 · 9,70413.895.127.636 / 38server CPU0.114.9 MiB
go7,75411.4813.0516.507,654 · 7,754 · 8,59212.198.022.430 / 30server CPU0.222.6 MiB
basic-webserver5,00417.6220.9025.085,263 · 4,880 · 5,0047.7100.014.819 / 20server CPU0.129.0 MiB
Under load: Templatesp99 latency against the offered rate (open loop: requests arrive at a fixed rate whatever the server does). Each server is offered 50% to 120% of its own maximum above.
1ms 10ms 100ms 1s 10s 0 25k 50k 75k 100k axum at 50% of its max: 18,685/s offered, 18,680/s answered; p99 2.82 ms, p99.9 12.67 ms; server CPU 51%, loader 11% axum at 75% of its max: 28,028/s offered, 28,018/s answered; p99 9.55 ms, p99.9 15.26 ms; server CPU 74%, loader 30% axum at 90% of its max: 33,633/s offered, 33,404/s answered; p99 416.12 ms, p99.9 421.74 ms; server CPU 99%, loader 21% axum at 100% of its max: 37,370/s offered, 33,670/s answered; p99 986.92 ms, p99.9 988.54 ms; server CPU 100%, loader 24% axum at 120% of its max: 44,844/s offered, 31,876/s answered; p99 2846.65 ms, p99.9 2886.74 ms; server CPU 100%, loader 18% axum roux at 50% of its max: 25,097/s offered, 25,089/s answered; p99 2.16 ms, p99.9 10.56 ms; server CPU 66%, loader 6% roux at 75% of its max: 37,645/s offered, 36,899/s answered; p99 171.44 ms, p99.9 192.24 ms; server CPU 92%, loader 18% roux at 90% of its max: 45,174/s offered, 43,292/s answered; p99 414.10 ms, p99.9 416.02 ms; server CPU 100%, loader 23% roux at 100% of its max: 50,193/s offered, 41,532/s answered; p99 1726.57 ms, p99.9 1728.76 ms; server CPU 100%, loader 23% roux at 120% of its max: 60,232/s offered, 48,841/s answered; p99 1874.33 ms, p99.9 1888.32 ms; server CPU 100%, loader 27% roux basic-webserver at 50% of its max: 2,252/s offered, 2,251/s answered; p99 2.54 ms, p99.9 7.43 ms; server CPU 68%, loader 3% basic-webserver at 75% of its max: 3,379/s offered, 3,378/s answered; p99 33.38 ms, p99.9 42.47 ms; server CPU 88%, loader 3% basic-webserver at 90% of its max: 4,054/s offered, 4,008/s answered; p99 164.35 ms, p99.9 169.55 ms; server CPU 100%, loader 3% basic-webserver at 100% of its max: 4,505/s offered, 4,366/s answered; p99 358.13 ms, p99.9 361.00 ms; server CPU 100%, loader 3% basic-webserver at 120% of its max: 5,406/s offered, 4,563/s answered; p99 1542.74 ms, p99.9 1555.58 ms; server CPU 100%, loader 4% basic-webserver go at 50% of its max: 5,074/s offered, 5,072/s answered; p99 5.56 ms, p99.9 9.91 ms; server CPU 64%, loader 5% go at 75% of its max: 7,611/s offered, 7,598/s answered; p99 15.61 ms, p99.9 21.51 ms; server CPU 88%, loader 4% go at 90% of its max: 9,133/s offered, 8,789/s answered; p99 434.38 ms, p99.9 445.50 ms; server CPU 100%, loader 5% go at 100% of its max: 10,148/s offered, 9,968/s answered; p99 165.00 ms, p99.9 180.15 ms; server CPU 100%, loader 7% go at 120% of its max: 12,178/s offered, 10,484/s answered; p99 1370.56 ms, p99.9 1393.45 ms; server CPU 100%, loader 6% go fourneau-zig at 50% of its max: 33,808/s offered, 33,800/s answered; p99 123.40 ms, p99.9 134.36 ms; server CPU 63%, loader 19% fourneau-zig at 75% of its max: 50,712/s offered, 50,689/s answered; p99 108.67 ms, p99.9 111.74 ms; server CPU 83%, loader 22% fourneau-zig at 90% of its max: 60,855/s offered, 60,832/s answered; p99 165.34 ms, p99.9 183.93 ms; server CPU 94%, loader 30% fourneau-zig at 100% of its max: 67,616/s offered, 65,070/s answered; p99 684.21 ms, p99.9 688.69 ms; server CPU 93%, loader 34% fourneau-zig at 120% of its max: 81,139/s offered, 76,707/s answered; p99 547.52 ms, p99.9 549.69 ms; server CPU 100%, loader 40% fourneau-zig

offered requests per second →

  • axum
  • roux
  • basic-webserver
  • go
  • fourneau-zig
  • the loader was the limit
Under load: RealWorld (Conduit)The mean latency of every request against the offered rate: the article list (50%), an article (30%), a comment (15%) and a favorite (5%) at once, open loop, at the same rates for every server, each climbing until it falls behind.
0.1ms 1ms 10ms 100ms 1s 10s 0 1.3k 2.5k 3.8k 5k go: 250/s offered, 251/s answered; mean 2.42 ms, the slowest part's p99 6.61 ms; server CPU 46%, loader 1% go: 500/s offered, 500/s answered; mean 2.61 ms, the slowest part's p99 10.73 ms; server CPU 74%, loader 1% go: 1,000/s offered, 973/s answered; mean 141.68 ms, the slowest part's p99 1991.69 ms; server CPU 100%, loader 2% go: 2,000/s offered, 1,013/s answered; mean 2513.27 ms, the slowest part's p99 5330.18 ms; server CPU 100%, loader 2% go fourneau-zig: 250/s offered, 251/s answered; mean 1.02 ms, the slowest part's p99 2.57 ms; server CPU 18%, loader 2% fourneau-zig: 500/s offered, 500/s answered; mean 0.94 ms, the slowest part's p99 4.96 ms; server CPU 30%, loader 1% fourneau-zig: 1,000/s offered, 1,000/s answered; mean 0.86 ms, the slowest part's p99 2.78 ms; server CPU 52%, loader 2% fourneau-zig: 2,000/s offered, 1,999/s answered; mean 1.66 ms, the slowest part's p99 17.50 ms; server CPU 83%, loader 3% fourneau-zig: 4,000/s offered, 2,922/s answered; mean 1378.17 ms, the slowest part's p99 2696.53 ms; server CPU 100%, loader 3% fourneau-zig basic-webserver: 250/s offered, 251/s answered; mean 2.13 ms, the slowest part's p99 6.10 ms; server CPU 42%, loader 1% basic-webserver: 500/s offered, 407/s answered; mean 1053.03 ms, the slowest part's p99 2479.31 ms; server CPU 100%, loader 1% basic-webserver axum: 250/s offered, 251/s answered; mean 1.50 ms, the slowest part's p99 4.11 ms; server CPU 31%, loader 1% axum: 500/s offered, 500/s answered; mean 1.53 ms, the slowest part's p99 4.98 ms; server CPU 53%, loader 1% axum: 1,000/s offered, 1,000/s answered; mean 81.33 ms, the slowest part's p99 458.01 ms; server CPU 97%, loader 3% axum: 2,000/s offered, 1,532/s answered; mean 942.70 ms, the slowest part's p99 4521.42 ms; server CPU 100%, loader 3% axum roux: 250/s offered, 251/s answered; mean 1.28 ms, the slowest part's p99 4.03 ms; server CPU 24%, loader 1% roux: 500/s offered, 500/s answered; mean 1.16 ms, the slowest part's p99 3.29 ms; server CPU 42%, loader 2% roux: 1,000/s offered, 999/s answered; mean 1.65 ms, the slowest part's p99 13.80 ms; server CPU 78%, loader 2% roux: 2,000/s offered, 1,167/s answered; mean 83.21 ms, the slowest part's p99 113.71 ms; server CPU 100%, loader 4% roux

offered requests per second →

  • go
  • fourneau-zig
  • basic-webserver
  • axum
  • roux
  • the loader was the limit

How it runs

Details: Workloads, Method. To make a server faster or add one: Contribute.