ewe@9 benchmarks

ewe@9 benchmarks against ewe@8 and nine other BEAM web servers over HTTP/1.1 and cleartext HTTP/2, measured on September 29 2026. The scripts and the exact method are in the repository’s benchmark directory.

Setup

machine     AMD Ryzen 7 5700G, 12 vCPUs in a KVM virtual machine, Linux 7.2
toolchain   Gleam 1.18.0, Erlang/OTP 29, Elixir 1.19.4
cpu         server pinned to CPUs 0-5, load generator to CPUs 6-11
throughput  h2load (nghttp2 1.70.0), 4 threads, 50 connections,
            10 streams per connection on HTTP/2,
            3 runs of 10s after a 3s warmup, median reported
latency     zrk 2.5.0, 4 threads, 50 connections,
            10 streams per connection on HTTP/2,
            10s per rate after a 3s warmup

Servers

serverversionHTTP/1.1HTTP/2
ewe@99.0.0yesyes
ewe@88.0.0yesyes
mist6.0.3yesno
elli3.3.0yesno
bandit1.12.0yesyes
httpdinets 9.7.1 (OTP 29)yesno
roadrunner0.8.0yesyes
chatterbox0.8.0noyes
cowboy2.19.0yesyes
mochiweb3.5.0yesno
yaws2.3.1yesno

Every server runs a production build with the default settings except:

bandit, chatterbox, elli, httpd and mochiweb have no native SSE API; elli and httpd cannot read a request body incrementally.

Cases

caserequestresponse
helloGET /helloHello, Joe!
hello_headersGET /hello with 7 extra headersHello, Joe!
echo_1kbPOST /echo, 1KiB bodythe body
echo_1kb_headersPOST /echo, 1KiB body, 7 extra headersthe body
echo_10kbPOST /echo, 10KiB bodythe body
echo_chunked_10kbPOST /echo/chunked, 10KiB bodythe body, read incrementally
file_tinyGET /file/tiny1KiB file
file_smallGET /file/small100KiB file
file_bigGET /file/big5MiB file
streamGET /stream2 chunks, hello, and Joe!
stream_smallGET /stream/small100 x 64B chunks
stream_bigGET /stream/big64 x 16KiB chunks
sseGET /sse32 events
sse_smallGET /sse/small100 events
sse_bigGET /sse/big64 x 16KiB events

Throughput

Requests per second, higher is better. Rps above 200_000 are limited by the load generator so small differences in numbers between servers may be not accurate.

HTTP/1.1

caseewe@9ewe@8mistellibandithttpdroadrunnercowboymochiwebyaws
hello266,046283,205199,559276,538 ~152,776103,490246,009116,951180,532165,957
hello_headers223,539221,090159,693219,366124,00587,236197,91495,855133,774118,936
echo_1kb230,146241,469173,837242,937139,17776,045213,37782,815158,673143,420
echo_1kb_headers201,422198,650143,568205,644116,81557,985185,18872,432122,660105,882
echo_10kb188,255190,263158,321166,777119,51012,513183,83266,638116,616111,922
echo_chunked_10kb188,239191,041155,390-109,274-183,60763,295117,395113,277
file_tiny69,50069,34637,83839,85749,34534,04638,77133,11664,847 ~84,558 ~
file_small58,11459,96235,10037,01844,61829,55935,87830,64120,22013,480
file_big3,6953,6223,5993,6573,6101,303 ~3,5863,648556575 ~
stream142,687144,423stalledstalled85,869102,90335,489 ~79,342100,729101,332
stream_small8,1658,092 ~stalledstalled7,1478,466 ~6,7596,7877,3406,219
stream_big8,3598,420 ~stalledstalled7,1318,4407,7007,0517,4456,504
sse17,70518,178stalled---13,09013,747-16,945
sse_small6,3446,484stalled---6,2705,017-5,900
sse_big6,4886,370stalled---2,4652,361-6,131

HTTP/2

caseewe@9ewe@8banditroadrunnerchatterboxcowboy
hello360,596160,28981,403211,1198,267134,163
hello_headers259,677136,40473,186172,4038,25577,239
echo_1kb199,023118,40268,576183,0237,31090,615
echo_1kb_headers162,428107,69962,943152,5657,22760,352
echo_10kb132,85396,79357,692138,2488,47676,147
echo_chunked_10kb132,77992,03054,870135,4598,48769,822
file_tiny128,79581,59439,19634,9938,38530,792
file_small45,262 ~47,144 ~30,113 ~25,00026,68311,224
file_big982 ~507 ~7501,066 ~721 ~321
stream203,34987,49852,199126,1738,73488,728
stream_small13,1564,8314,5006,42410,9225,884
stream_big11,957 ~5,2334,8426,678stalled6,212
sse24,4489,825-15,974-12,448
sse_small8,6673,415-5,673-4,298
sse_big5,4493,208-2,193-2,134

Latency

p99 latency at a fixed offered rate with no coordinated omission, lower is better. Every server gets the same rates.

HTTP/1.1

casereq/sewe@9ewe@8mistellibandithttpdroadrunnercowboymochiwebyaws
hello50,000169us162us1.71ms132us236us490us153us429us148us159us
hello100,0001.35ms1.26ms2.79ms833us3.04ms37.78ms1.18ms14.32ms2.49ms2.82ms
hello150,0003.19ms3.21ms3.32ms2.90ms355.71msoverloaded3.15msoverloaded6.25ms9.35ms
hello_headers50,000218us207us231us171us318us2.70ms198us910us422us437us
hello_headers100,0001.26ms2.17ms3.10ms2.12ms3.33msoverloaded2.05msoverloaded16.10ms6.70ms
hello_headers150,0003.35ms3.67ms418.43ms2.88msoverloadedoverloaded4.28msoverloadedoverloadedoverloaded
echo_1kb50,000162us159us195us162us208us3.96ms167us2.77ms253us220us
echo_1kb100,0001.83ms1.68ms2.52ms1.23ms2.84msoverloaded2.73msoverloaded3.93ms3.63ms
echo_1kb150,0003.65ms4.57ms11.44ms3.15msoverloadedoverloaded3.17msoverloaded18.38ms243.65ms
echo_1kb_headers40,000156us176us272us159us295us3.39ms166us1.52ms259us236us
echo_1kb_headers80,0001.66ms832us3.07ms561us3.25msoverloaded680usoverloaded3.77ms3.81ms
echo_1kb_headers120,0003.61ms2.94ms8.80ms2.87msoverloadedoverloaded3.10msoverloadedoverloadedoverloaded
echo_10kb20,000161us157us195us154us188usoverloaded169us343us201us199us
echo_10kb60,000469us320us317us554us2.51msoverloaded253us32.55ms3.24ms2.87ms
echo_10kb100,0001.16ms2.26ms3.71ms3.18ms4.21msoverloaded2.81msoverloaded13.04ms106.14ms
echo_chunked_10kb40,000177us139us220us-356us-160us2.89ms237us305us
echo_chunked_10kb70,000380us408us2.31ms-2.95ms-455usoverloaded3.33ms3.31ms
echo_chunked_10kb100,0003.29ms2.40ms3.24ms-27.50ms-3.12msoverloaded6.44ms30.41ms
file_tiny20,000707us398us929us442us1.76ms669us529us976us1.59ms222us
file_tiny40,0003.94ms3.76msoverloaded181.95ms6.53msoverloadedoverloadedoverloaded4.94ms386us
file_tiny60,00037.87ms54.42msoverloadedoverloadedoverloadedoverloadedoverloadedoverloaded160.19msoverloaded
file_small15,000398us343us577us508us777us1.10ms571us1.25ms29.99msoverloaded
file_small30,0003.35ms3.01ms4.09ms3.76ms3.91msoverloaded5.10msoverloadedoverloadedoverloaded
file_small45,0009.35ms9.60msoverloadedoverloadedoverloadedoverloadedoverloadedoverloadedoverloadedoverloaded
file_big5002.07ms1.90ms1.92ms1.90ms2.38ms2.24ms1.86ms2.30ms58.06ms25.66ms
file_big1,0002.40ms2.31ms2.45ms2.52ms2.36ms4.68ms2.52ms2.25msoverloadedoverloaded
file_big1,5002.55ms2.50ms2.65ms2.58ms2.45ms7.49ms2.65ms2.44msoverloadedoverloaded
stream20,000208us199userrorserrors287us256us715us290us232us253us
stream40,000243us274userrorserrors888us439usoverloaded1.40ms402us556us
stream60,000668us838userrorserrors3.56ms3.12msoverloaded5.58ms3.23ms3.51ms
stream_small3,0001.77ms1.72mserrorserrors2.15ms1.67ms2.13ms2.16ms2.08ms2.52ms
stream_small5,0002.65ms2.70mserrorserrors5.98ms2.38ms4.76ms6.42ms5.37ms17.22ms
stream_small7,00016.05ms11.56mserrorserrorsoverloaded10.38msoverloadedoverloadedoverloadedoverloaded
stream_big3,0001.77ms1.76mserrorserrors2.06ms1.72ms1.92ms1.92ms1.97ms2.21ms
stream_big5,0002.39ms2.29mserrorserrors3.62ms2.19ms3.03ms4.48ms3.55ms9.61ms
stream_big7,00012.43ms15.05mserrorserrors452.22ms19.45ms61.58ms264.06ms103.01msoverloaded
sse6,0001.03ms1.04ms1.77ms---1.28ms1.33ms-1.12ms
sse10,0001.80ms1.63ms52.66ms---4.65ms4.83ms-3.04ms
sse14,0005.30ms5.65msoverloaded---overloaded366.72ms-16.98ms
sse_small3,0002.42ms2.33ms3.48ms---2.29ms3.75ms-2.62ms
sse_small5,0007.75ms8.28msoverloaded---7.58msoverloaded-33.74ms
sse_small7,000overloadedoverloadedoverloaded---overloadedoverloaded-overloaded
sse_big3,0002.25ms2.21ms2.57ms---overloadedoverloaded-2.35ms
sse_big5,0009.18ms6.50ms20.36ms---overloadedoverloaded-12.51ms
sse_big7,000overloadedoverloadedoverloaded---overloadedoverloaded-overloaded

HTTP/2

casereq/sewe@9ewe@8banditroadrunnerchatterboxcowboy
hello50,000242us211us3.30ms243userrors636us
hello100,000603us206usoverloaded2.88mserrors12.53ms
hello150,0004.41ms18.79msoverloaded7.41mserrorsoverloaded
hello_headers50,000370us257us6.03ms2.66mserrors8.24ms
hello_headers100,0005.93ms26.04msoverloaded20.74mserrorsoverloaded
hello_headers150,000141.25msoverloadedoverloadedoverloadederrorsoverloaded
echo_1kb50,000240us337us4.24ms301userrorserrors
echo_1kb100,0004.55ms8.62msoverloaded3.75mserrorserrors
echo_1kb150,00070.56msoverloadedoverloaded40.53mserrorserrors
echo_1kb_headers40,000401us354us3.26ms551userrors6.87ms
echo_1kb_headers80,0009.40ms39.89msoverloaded6.60mserrorserrors
echo_1kb_headers120,000overloadedoverloadedoverloadedoverloadederrorserrors
echo_10kb20,000319us283us386us211userrors634us
echo_10kb60,000343us578usoverloaded1.46mserrorserrors
echo_10kb100,00013.96msoverloadedoverloaded4.99mserrorserrors
echo_chunked_10kb40,000340us343us3.62ms469userrorserrors
echo_chunked_10kb70,000482us677usoverloaded2.61mserrorserrors
echo_chunked_10kb100,00019.30msoverloadedoverloaded5.69mserrorserrors
file_tiny20,0001.39ms1.28ms2.45ms2.19mserrors1.98ms
file_tiny40,0004.04ms2.55msoverloadedoverloadederrorsoverloaded
file_tiny60,0008.60ms38.86msoverloadedoverloadederrorsoverloaded
file_small15,0001.40ms921us2.60ms3.05mserrorsoverloaded
file_small30,0007.16ms3.47ms462.98msoverloadederrorsoverloaded
file_small45,000overloaded93.66msoverloadedoverloadederrorsoverloaded
file_big5004.09msoverloaded3.36ms5.64mserrorsoverloaded
file_big1,00058.96msoverloadedoverloaded15.00mserrorsoverloaded
file_big1,500overloadedoverloadedoverloadedoverloadederrorsoverloaded
stream20,000328us341us459us244us-375us
stream40,000406us360us6.45ms572us-640us
stream60,0001.15ms617usoverloaded3.29ms-4.95ms
stream_small3,0003.07ms2.71ms5.19ms2.29ms-2.37ms
stream_small5,00025.61ms203.97msoverloaded18.98ms-54.45ms
stream_small7,00049.14msoverloadedoverloadedoverloaded-overloaded
stream_big3,0002.52ms2.54ms3.33ms2.12ms-2.24ms
stream_big5,00016.74ms12.80ms260.80ms7.68ms-6.16ms
stream_big7,00041.97msoverloadedoverloadedoverloaded-overloaded
sse6,0002.28ms2.58ms-1.25ms-1.78ms
sse10,00015.81ms602.37ms-2.65ms-9.42ms
sse14,00036.40msoverloaded-38.22ms-overloaded
sse_small3,00011.04ms16.81ms-2.73ms-4.86ms
sse_small5,00067.42msoverloaded-65.07ms-overloaded
sse_small7,000116.32msoverloaded-overloaded-overloaded
sse_big3,0005.97ms4.67ms-overloaded-overloaded
sse_big5,000225.09msoverloaded-overloaded-overloaded
sse_big7,000overloadedoverloaded-overloaded-overloaded

chatterbox could not sustain any of the fixed rates, answering a few hundred requests per second at most. Its connections crashed whenever a client closed the socket first. Under the constant load the memory grew until the kernel killed it during the file_big case.

Legend

✨ Search Document