From efc1e8c573e0d34aeac1dc77fcb4103ee47d7ac2 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Tue, 11 Aug 2026 07:06:55 +0200 Subject: [PATCH 1/5] Bump fulmine to 5.5.2 --- frameworks/fulmine/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/fulmine/package.json b/frameworks/fulmine/package.json index 183d49a26..8db63451b 100644 --- a/frameworks/fulmine/package.json +++ b/frameworks/fulmine/package.json @@ -2,7 +2,7 @@ "name": "httparena-fulmine", "private": true, "dependencies": { - "fulmine.js": "^5.5.0", + "fulmine.js": "^5.5.2", "pg": "^8.13.0", "pg-native": "^3.8.0", "ioredis": "^5.4.1" From 74ef5432bad6b15572b294d8f372cd35610d4986 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Tue, 11 Aug 2026 07:17:14 +0200 Subject: [PATCH 2/5] fulmine: serve /static over TLS and subscribe to static-tls --- frameworks/fulmine/app.js | 10 +++++++--- frameworks/fulmine/meta.json | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/frameworks/fulmine/app.js b/frameworks/fulmine/app.js index 11cf43c7a..d5e6e067a 100644 --- a/frameworks/fulmine/app.js +++ b/frameworks/fulmine/app.js @@ -336,7 +336,9 @@ if (cluster.isPrimary) { } }); - app.get('/static/:filename', (req, res) => { + // shared by the plaintext listener and the TLS one on 8081, as the JSON route is: static-tls + // asks for the same files over TLS + const registerStaticRoute = (target) => target.get('/static/:filename', (req, res) => { const sf = staticFiles[req.params.filename]; if (!sf) return res.status(404).send('Not found'); const ae = req.headers['accept-encoding'] || ''; @@ -356,6 +358,7 @@ if (cluster.isPrimary) { res.set(headers).send(buf); }); }); + registerStaticRoute(app); // WebSocket echo profiles, on µWS's own WebSocket server through the app's uwsApp handle. // Every connection performs µWS's real upgrade handshake; the echo hands the incoming @@ -368,8 +371,8 @@ if (cluster.isPrimary) { } }); - // json-tls profile: the same JSON route over uWS's native TLS on 8081. The certs are - // mounted by the harness for the TLS profiles; without them there is simply no listener. + // json-tls and static-tls profiles: the same two routes over uWS's native TLS on 8081. The + // certs are mounted by the harness for the TLS profiles; without them there is no listener. if (fs.existsSync('/certs/server.key') && fs.existsSync('/certs/server.crt')) { const tlsApp = express({ uwsOptions: { @@ -380,6 +383,7 @@ if (cluster.isPrimary) { tlsApp.disable('x-powered-by'); tlsApp.set('etag', false); registerJsonRoute(tlsApp); + registerStaticRoute(tlsApp); tlsApp.listen(8081); } diff --git a/frameworks/fulmine/meta.json b/frameworks/fulmine/meta.json index b64061604..6e972fe02 100644 --- a/frameworks/fulmine/meta.json +++ b/frameworks/fulmine/meta.json @@ -18,6 +18,7 @@ "api-16", "async-db", "static", + "static-tls", "echo-ws", "echo-ws-pipeline", "echo-ws-limited", From a9202feba46b2ac5d886b188451d99cafef9df71 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Tue, 11 Aug 2026 07:18:18 +0200 Subject: [PATCH 3/5] fulmine: prefer brotli for json-comp, where the score squares the body size --- frameworks/fulmine/app.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/frameworks/fulmine/app.js b/frameworks/fulmine/app.js index d5e6e067a..0c8405d4e 100644 --- a/frameworks/fulmine/app.js +++ b/frameworks/fulmine/app.js @@ -20,9 +20,11 @@ if (cluster.isPrimary) { const express = require('fulmine.js'); const fs = require('fs'); const zlib = require('zlib'); - // level 1: the arena measures throughput of compressed JSON, and the payloads are small - // enough that a higher level buys bytes nobody counts + // json-comp counts the bytes twice over, rps * (minBpr/myBpr)^2, so brotli is preferred where + // the client offers it: q3 is 12% smaller than gzip level 1 here for 24us more per request. + // Gzip stays for a client that asks only for gzip, where the level is not worth the CPU. const GZIP_OPTS = { level: 1 }; + const BROTLI_OPTS = { params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 3 } }; const app = express(); app.disable('x-powered-by'); @@ -164,14 +166,14 @@ if (cluster.isPrimary) { const body = JSON.stringify({ items, count }); // json-comp profile: negotiated per request, nothing without Accept-Encoding const ae = req.headers['accept-encoding'] || ''; - if (ae.includes('gzip')) { + if (ae.includes('br')) { + res.set({ ...SERVER_HDR, 'content-encoding': 'br' }) + .type('application/json') + .send(zlib.brotliCompressSync(body, BROTLI_OPTS)); + } else if (ae.includes('gzip')) { res.set({ ...SERVER_HDR, 'content-encoding': 'gzip' }) .type('application/json') .send(zlib.gzipSync(body, GZIP_OPTS)); - } else if (ae.includes('br')) { - res.set({ ...SERVER_HDR, 'content-encoding': 'br' }) - .type('application/json') - .send(zlib.brotliCompressSync(body, { params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 3 } })); } else { res.set(SERVER_HDR).type('application/json').send(body); } From 574ffc38a8204d995e83521d72a3987c489f6ef7 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Tue, 11 Aug 2026 07:36:26 +0200 Subject: [PATCH 4/5] fulmine: add a Caddy edge and subscribe to gateway-64 and gateway-h3 --- frameworks/fulmine/compose.gateway-h3.yml | 43 +++++++++++++++++++++ frameworks/fulmine/compose.gateway.yml | 46 +++++++++++++++++++++++ frameworks/fulmine/meta.json | 4 +- frameworks/fulmine/proxy/Caddyfile | 43 +++++++++++++++++++++ frameworks/fulmine/proxy/Dockerfile | 10 +++++ 5 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 frameworks/fulmine/compose.gateway-h3.yml create mode 100644 frameworks/fulmine/compose.gateway.yml create mode 100644 frameworks/fulmine/proxy/Caddyfile create mode 100644 frameworks/fulmine/proxy/Dockerfile diff --git a/frameworks/fulmine/compose.gateway-h3.yml b/frameworks/fulmine/compose.gateway-h3.yml new file mode 100644 index 000000000..7896b56ab --- /dev/null +++ b/frameworks/fulmine/compose.gateway-h3.yml @@ -0,0 +1,43 @@ +# gateway-h3 - the same two services as compose.gateway.yml, reached over QUIC +# instead. Stock Caddy already binds 8443 on tcp and udp with `protocols h1 h2 +# h3`, so the proxy config is identical and only the load generator differs. +# The proxy to server hop stays loopback h1 either way. +services: + proxy: + build: + context: ./proxy + network_mode: host + cpuset: "${PROXY_CPUSET:-0-15,64-79}" + ulimits: + memlock: -1 + nofile: + soft: 1048576 + hard: 1048576 + security_opt: + - seccomp:unconfined + volumes: + - ${CERTS_DIR}:/certs:ro + - ${DATA_DIR}/static:/data/static:ro + depends_on: + - server + + server: + build: + context: . + dockerfile: Dockerfile + network_mode: host + cpuset: "${SERVER_CPUSET:-16-31,80-95}" + ulimits: + memlock: -1 + nofile: + soft: 1048576 + hard: 1048576 + security_opt: + - seccomp:unconfined + environment: + - DATABASE_URL=${DATABASE_URL} + - DATABASE_MAX_CONN=256 + - DATASET_PATH=/data/dataset.json + volumes: + - ${DATA_DIR}/dataset.json:/data/dataset.json:ro + - ${DATA_DIR}/static:/data/static:ro diff --git a/frameworks/fulmine/compose.gateway.yml b/frameworks/fulmine/compose.gateway.yml new file mode 100644 index 000000000..bd8e50bc4 --- /dev/null +++ b/frameworks/fulmine/compose.gateway.yml @@ -0,0 +1,46 @@ +# gateway-64 - stock Caddy (TLS + h2 on 8443) in front of the fulmine server, +# forwarding the dynamic endpoints over loopback h1 with keepalive. The server +# gets no certs here, so it comes up cleartext on 8080 only. +# +# The CPU split is the knob worth sweeping, via PROXY_CPUSET / SERVER_CPUSET. +# Terminating TLS under multiplexed h2 is usually the heavier half, so the +# proxy starts with the same share as the server rather than less. +services: + proxy: + build: + context: ./proxy + network_mode: host + cpuset: "${PROXY_CPUSET:-0-15,64-79}" + ulimits: + memlock: -1 + nofile: + soft: 1048576 + hard: 1048576 + security_opt: + - seccomp:unconfined + volumes: + - ${CERTS_DIR}:/certs:ro + - ${DATA_DIR}/static:/data/static:ro + depends_on: + - server + + server: + build: + context: . + dockerfile: Dockerfile + network_mode: host + cpuset: "${SERVER_CPUSET:-16-31,80-95}" + ulimits: + memlock: -1 + nofile: + soft: 1048576 + hard: 1048576 + security_opt: + - seccomp:unconfined + environment: + - DATABASE_URL=${DATABASE_URL} + - DATABASE_MAX_CONN=256 + - DATASET_PATH=/data/dataset.json + volumes: + - ${DATA_DIR}/dataset.json:/data/dataset.json:ro + - ${DATA_DIR}/static:/data/static:ro diff --git a/frameworks/fulmine/meta.json b/frameworks/fulmine/meta.json index 6e972fe02..49836e47a 100644 --- a/frameworks/fulmine/meta.json +++ b/frameworks/fulmine/meta.json @@ -23,7 +23,9 @@ "echo-ws-pipeline", "echo-ws-limited", "json-tls", - "crud" + "crud", + "gateway-64", + "gateway-h3" ], "maintainers": [ "nigrosimone" diff --git a/frameworks/fulmine/proxy/Caddyfile b/frameworks/fulmine/proxy/Caddyfile new file mode 100644 index 000000000..f0978b039 --- /dev/null +++ b/frameworks/fulmine/proxy/Caddyfile @@ -0,0 +1,43 @@ +# fulmine gateway edge. +# +# Stock Caddy terminates TLS and h1/h2/h3 on 8443, serves /static/* from disk, +# and forwards the dynamic endpoints to the fulmine server. Both services run +# with network_mode: host, so the server is reachable on loopback. +# +# The same file covers gateway-64 and gateway-h3: Caddy binds 8443 on tcp and +# udp both, and only the load generator differs between the two profiles. +{ + admin off + auto_https off + servers { + protocols h1 h2 h3 + } +} + +https://localhost:8443 { + tls /certs/server.crt /certs/server.key + + # the profile asks the proxy to serve these from disk rather than forward + # them. precompressed prefers the .br / .gz sidecars per Accept-Encoding. + # (root /data + request /static/foo -> /data/static/foo.) + handle /static/* { + root * /data + file_server { + precompressed br gzip + } + } + + # everything else is the fulmine server. Plain h1 with a large keepalive + # pool, so the streams arriving multiplexed over one h2 connection fan out + # across the backend workers instead of queueing behind one upstream. + handle { + reverse_proxy 127.0.0.1:8080 { + transport http { + versions 1.1 + keepalive 5m + keepalive_idle_conns 2048 + keepalive_idle_conns_per_host 2048 + } + } + } +} diff --git a/frameworks/fulmine/proxy/Dockerfile b/frameworks/fulmine/proxy/Dockerfile new file mode 100644 index 000000000..02342c706 --- /dev/null +++ b/frameworks/fulmine/proxy/Dockerfile @@ -0,0 +1,10 @@ +# Stock Caddy, which ships h1/h2/h3 in the base image, so no custom build. It +# covers gateway-64 (h2 over TCP) and gateway-h3 (QUIC over UDP) from the one +# Caddyfile, which binds 8443 on both. +FROM caddy:2-alpine + +COPY Caddyfile /etc/caddy/Caddyfile + +EXPOSE 8443/tcp 8443/udp + +CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"] From 51b5b517332f84c3f226a9abadd3e97622dc535d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 11 Aug 2026 08:36:18 +0000 Subject: [PATCH 5/5] Benchmark results: fulmine [skip ci] --- site/data/results/fulmine.json | 553 ++++++++++++------- site/static/logs/gateway-64/1024/fulmine.log | 1 + site/static/logs/gateway-64/512/fulmine.log | 1 + site/static/logs/gateway-h3/256/fulmine.log | 1 + site/static/logs/gateway-h3/64/fulmine.log | 1 + site/static/logs/static-tls/1024/fulmine.log | 0 site/static/logs/static-tls/4096/fulmine.log | 0 site/static/logs/static-tls/6800/fulmine.log | 0 8 files changed, 357 insertions(+), 200 deletions(-) create mode 100644 site/static/logs/gateway-64/1024/fulmine.log create mode 100644 site/static/logs/gateway-64/512/fulmine.log create mode 100644 site/static/logs/gateway-h3/256/fulmine.log create mode 100644 site/static/logs/gateway-h3/64/fulmine.log create mode 100644 site/static/logs/static-tls/1024/fulmine.log create mode 100644 site/static/logs/static-tls/4096/fulmine.log create mode 100644 site/static/logs/static-tls/6800/fulmine.log diff --git a/site/data/results/fulmine.json b/site/data/results/fulmine.json index cb05c2101..027640212 100644 --- a/site/data/results/fulmine.json +++ b/site/data/results/fulmine.json @@ -4,71 +4,71 @@ "api-16-1024": { "framework": "fulmine", "language": "JS", - "rps": 129658, + "rps": 131175, "avg_latency": "6.14ms", - "p99_latency": "42.80ms", - "cpu": "1542.9%", - "memory": "1.2GiB", + "p99_latency": "52.50ms", + "cpu": "1540.6%", + "memory": "1.3GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "661.67MB/s", - "input_bw": "7.30MB/s", - "reconnects": 388853, - "status_2xx": 1944876, + "bandwidth": "669.49MB/s", + "input_bw": "7.38MB/s", + "reconnects": 393639, + "status_2xx": 1967626, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 729380, - "tpl_json": 729721, + "tpl_baseline": 737703, + "tpl_json": 737952, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 485774 + "tpl_async_db": 491970 }, "api-4-256": { "framework": "fulmine", "language": "JS", - "rps": 35639, - "avg_latency": "5.89ms", - "p99_latency": "31.30ms", - "cpu": "393.3%", - "memory": "425MiB", + "rps": 36387, + "avg_latency": "5.91ms", + "p99_latency": "32.10ms", + "cpu": "394.5%", + "memory": "402MiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "181.83MB/s", - "input_bw": "2.01MB/s", - "reconnects": 106930, - "status_2xx": 534593, + "bandwidth": "185.64MB/s", + "input_bw": "2.05MB/s", + "reconnects": 109168, + "status_2xx": 545805, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 200532, - "tpl_json": 200430, + "tpl_baseline": 204733, + "tpl_json": 204654, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 133631 + "tpl_async_db": 136418 }, "async-db-1024": { "framework": "fulmine", "language": "JS", - "rps": 224285, + "rps": 224608, "avg_latency": "4.05ms", - "p99_latency": "20.00ms", - "cpu": "5942.1%", + "p99_latency": "24.90ms", + "cpu": "5944.0%", "memory": "3.6GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "872.77MB/s", - "input_bw": "14.97MB/s", - "reconnects": 89382, - "status_2xx": 2242851, + "bandwidth": "874.29MB/s", + "input_bw": "14.99MB/s", + "reconnects": 89523, + "status_2xx": 2246080, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -76,19 +76,19 @@ "baseline-4096": { "framework": "fulmine", "language": "JS", - "rps": 1212009, - "avg_latency": "3.38ms", - "p99_latency": "4.54ms", - "cpu": "6776.3%", + "rps": 1297447, + "avg_latency": "3.16ms", + "p99_latency": "4.42ms", + "cpu": "6797.5%", "memory": "2.6GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "211.45MB/s", - "input_bw": "93.62MB/s", + "bandwidth": "226.38MB/s", + "input_bw": "100.22MB/s", "reconnects": 0, - "status_2xx": 6060046, + "status_2xx": 6487238, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -96,19 +96,19 @@ "baseline-512": { "framework": "fulmine", "language": "JS", - "rps": 1230527, - "avg_latency": "415us", - "p99_latency": "1.04ms", - "cpu": "6816.6%", + "rps": 1335278, + "avg_latency": "382us", + "p99_latency": "975us", + "cpu": "6794.8%", "memory": "2.6GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "214.57MB/s", - "input_bw": "95.06MB/s", + "bandwidth": "232.98MB/s", + "input_bw": "103.15MB/s", "reconnects": 0, - "status_2xx": 6152639, + "status_2xx": 6676391, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -116,19 +116,19 @@ "crud-4096": { "framework": "fulmine", "language": "JS", - "rps": 357460, - "avg_latency": "11.41ms", + "rps": 355740, + "avg_latency": "11.44ms", "p99_latency": "20.70ms", - "cpu": "4430.6%", - "memory": "8.0GiB", + "cpu": "4401.2%", + "memory": "8.1GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "141.76MB/s", - "input_bw": "30.68MB/s", - "reconnects": 24824, - "status_2xx": 5361909, + "bandwidth": "140.84MB/s", + "input_bw": "30.53MB/s", + "reconnects": 24570, + "status_2xx": 5336110, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -136,18 +136,18 @@ "echo-ws-16384": { "framework": "fulmine", "language": "JS", - "rps": 3577210, - "avg_latency": "4.57ms", - "p99_latency": "9.15ms", - "cpu": "6232.0%", + "rps": 3565343, + "avg_latency": "4.56ms", + "p99_latency": "8.94ms", + "cpu": "6209.8%", "memory": "2.5GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "24.38MB/s", + "bandwidth": "24.30MB/s", "reconnects": 0, - "status_2xx": 17886053, + "status_2xx": 17826718, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -155,18 +155,18 @@ "echo-ws-4096": { "framework": "fulmine", "language": "JS", - "rps": 3768590, + "rps": 3785984, "avg_latency": "1.08ms", - "p99_latency": "2.27ms", - "cpu": "6547.5%", + "p99_latency": "2.31ms", + "cpu": "6549.7%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "25.19MB/s", + "bandwidth": "25.26MB/s", "reconnects": 0, - "status_2xx": 18842950, + "status_2xx": 18929921, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -174,18 +174,18 @@ "echo-ws-512": { "framework": "fulmine", "language": "JS", - "rps": 3726934, - "avg_latency": "136us", - "p99_latency": "409us", - "cpu": "6467.6%", + "rps": 3705673, + "avg_latency": "137us", + "p99_latency": "362us", + "cpu": "6522.3%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "24.88MB/s", + "bandwidth": "24.73MB/s", "reconnects": 0, - "status_2xx": 18634673, + "status_2xx": 18528368, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -193,18 +193,18 @@ "echo-ws-limited-4096": { "framework": "fulmine", "language": "JS", - "rps": 2564958, - "avg_latency": "1.06ms", - "p99_latency": "2.85ms", - "cpu": "6043.9%", + "rps": 2557031, + "avg_latency": "1.07ms", + "p99_latency": "2.87ms", + "cpu": "6232.9%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "57.75MB/s", - "reconnects": 1281697, - "status_2xx": 12824793, + "bandwidth": "57.56MB/s", + "reconnects": 1278194, + "status_2xx": 12785156, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -212,18 +212,18 @@ "echo-ws-limited-512": { "framework": "fulmine", "language": "JS", - "rps": 2089072, - "avg_latency": "147us", - "p99_latency": "531us", - "cpu": "5617.6%", - "memory": "2.3GiB", + "rps": 2083680, + "avg_latency": "146us", + "p99_latency": "532us", + "cpu": "5585.6%", + "memory": "2.4GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "47.01MB/s", - "reconnects": 1044563, - "status_2xx": 10445364, + "bandwidth": "46.89MB/s", + "reconnects": 1041876, + "status_2xx": 10418400, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -231,18 +231,18 @@ "echo-ws-pipeline-16384": { "framework": "fulmine", "language": "JS", - "rps": 23866108, - "avg_latency": "10.79ms", - "p99_latency": "14.60ms", - "cpu": "6339.2%", + "rps": 23533654, + "avg_latency": "10.91ms", + "p99_latency": "15.50ms", + "cpu": "6309.9%", "memory": "2.6GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "159.80MB/s", + "bandwidth": "157.57MB/s", "reconnects": 0, - "status_2xx": 119330544, + "status_2xx": 117668272, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -250,18 +250,18 @@ "echo-ws-pipeline-4096": { "framework": "fulmine", "language": "JS", - "rps": 24928886, - "avg_latency": "2.62ms", - "p99_latency": "5.50ms", - "cpu": "6589.2%", + "rps": 24778835, + "avg_latency": "2.64ms", + "p99_latency": "5.44ms", + "cpu": "6573.8%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "166.45MB/s", + "bandwidth": "165.46MB/s", "reconnects": 0, - "status_2xx": 124644432, + "status_2xx": 123894176, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -269,29 +269,125 @@ "echo-ws-pipeline-512": { "framework": "fulmine", "language": "JS", - "rps": 24949417, - "avg_latency": "327us", - "p99_latency": "848us", - "cpu": "6817.8%", + "rps": 24580339, + "avg_latency": "332us", + "p99_latency": "961us", + "cpu": "6740.0%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "166.53MB/s", + "bandwidth": "164.05MB/s", "reconnects": 0, - "status_2xx": 124747088, + "status_2xx": 122901696, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 }, + "gateway-64-1024": { + "framework": "fulmine", + "language": "JS", + "rps": 82340, + "avg_latency": "336.49ms", + "p99_latency": "4.78s", + "cpu": "4268.4%", + "memory": "6.7GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "969.29MB/s", + "reconnects": 0, + "status_2xx": 415819, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0, + "tpl_static": 124745, + "tpl_baseline": 83163, + "tpl_json": 145536, + "tpl_async_db": 62372, + "cpu_breakdown": "proxy: 3148% 4.3GiB | server: 1120% 2.3GiB" + }, + "gateway-64-512": { + "framework": "fulmine", + "language": "JS", + "rps": 88935, + "avg_latency": "171.71ms", + "p99_latency": "1.97s", + "cpu": "4318.6%", + "memory": "4.5GiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "999.86MB/s", + "reconnects": 0, + "status_2xx": 448233, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0, + "tpl_static": 134469, + "tpl_baseline": 89646, + "tpl_json": 156881, + "tpl_async_db": 67234, + "cpu_breakdown": "proxy: 3206% 2.1GiB | server: 1113% 2.4GiB" + }, + "gateway-h3-256": { + "framework": "fulmine", + "language": "JS", + "rps": 62791, + "avg_latency": "126.37ms", + "p99_latency": "745.76ms", + "cpu": "2626.4%", + "memory": "3.7GiB", + "connections": 256, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "665.78MB/s", + "reconnects": 0, + "status_2xx": 315843, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0, + "tpl_static": 94752, + "tpl_baseline": 63168, + "tpl_json": 110545, + "tpl_async_db": 47376, + "cpu_breakdown": "server: 712% 1.9GiB | proxy: 1915% 1.8GiB" + }, + "gateway-h3-64": { + "framework": "fulmine", + "language": "JS", + "rps": 91075, + "avg_latency": "22.37ms", + "p99_latency": "82.88ms", + "cpu": "3590.5%", + "memory": "2.6GiB", + "connections": 64, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "987.63MB/s", + "reconnects": 0, + "status_2xx": 456286, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0, + "tpl_static": 136885, + "tpl_baseline": 91257, + "tpl_json": 159700, + "tpl_async_db": 68442, + "cpu_breakdown": "server: 1016% 2.2GiB | proxy: 2574% 421MiB" + }, "json-4096": { "framework": "fulmine", "language": "JS", - "rps": 1141097, - "avg_latency": "3.23ms", - "p99_latency": "9.76ms", - "cpu": "6649.7%", + "rps": 1141084, + "avg_latency": "3.22ms", + "p99_latency": "9.98ms", + "cpu": "6444.0%", "memory": "2.6GiB", "connections": 4096, "threads": 64, @@ -299,8 +395,8 @@ "pipeline": 1, "bandwidth": "3.94GB/s", "input_bw": "54.41MB/s", - "reconnects": 226622, - "status_2xx": 5705485, + "reconnects": 226492, + "status_2xx": 5705420, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -308,19 +404,19 @@ "json-comp-16384": { "framework": "fulmine", "language": "JS", - "rps": 438127, - "avg_latency": "36.98ms", - "p99_latency": "87.60ms", - "cpu": "6312.7%", - "memory": "10.6GiB", + "rps": 374554, + "avg_latency": "43.32ms", + "p99_latency": "100.40ms", + "cpu": "6309.4%", + "memory": "10.3GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "684.18MB/s", - "input_bw": "32.59MB/s", - "reconnects": 80813, - "status_2xx": 2190635, + "bandwidth": "514.56MB/s", + "input_bw": "27.86MB/s", + "reconnects": 66369, + "status_2xx": 1872771, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -328,19 +424,19 @@ "json-comp-4096": { "framework": "fulmine", "language": "JS", - "rps": 425219, - "avg_latency": "9.61ms", - "p99_latency": "31.50ms", - "cpu": "6419.6%", - "memory": "9.2GiB", + "rps": 356319, + "avg_latency": "11.46ms", + "p99_latency": "37.10ms", + "cpu": "6407.9%", + "memory": "9.0GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "663.98MB/s", - "input_bw": "31.63MB/s", - "reconnects": 83547, - "status_2xx": 2126097, + "bandwidth": "489.46MB/s", + "input_bw": "26.51MB/s", + "reconnects": 69496, + "status_2xx": 1781596, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -348,19 +444,19 @@ "json-comp-512": { "framework": "fulmine", "language": "JS", - "rps": 412239, - "avg_latency": "1.24ms", - "p99_latency": "7.18ms", - "cpu": "6227.9%", - "memory": "8.7GiB", + "rps": 341669, + "avg_latency": "1.49ms", + "p99_latency": "10.70ms", + "cpu": "6164.5%", + "memory": "8.0GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "643.76MB/s", - "input_bw": "30.67MB/s", - "reconnects": 82462, - "status_2xx": 2061195, + "bandwidth": "469.38MB/s", + "input_bw": "25.42MB/s", + "reconnects": 68343, + "status_2xx": 1708346, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -368,10 +464,10 @@ "json-tls-4096": { "framework": "fulmine", "language": "JS", - "rps": 1076647, - "avg_latency": "3.77ms", - "p99_latency": "42.11ms", - "cpu": "6586.0%", + "rps": 1076676, + "avg_latency": "3.78ms", + "p99_latency": "54.63ms", + "cpu": "6585.5%", "memory": "2.6GiB", "connections": 4096, "threads": 64, @@ -379,7 +475,7 @@ "pipeline": 1, "bandwidth": "3.72GB", "reconnects": 0, - "status_2xx": 5489512, + "status_2xx": 5490408, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -387,19 +483,19 @@ "limited-conn-4096": { "framework": "fulmine", "language": "JS", - "rps": 1102548, - "avg_latency": "3.70ms", - "p99_latency": "15.50ms", - "cpu": "6412.2%", + "rps": 1175660, + "avg_latency": "3.47ms", + "p99_latency": "14.40ms", + "cpu": "6459.1%", "memory": "2.7GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "192.37MB/s", - "input_bw": "85.17MB/s", - "reconnects": 549730, - "status_2xx": 5512740, + "bandwidth": "205.12MB/s", + "input_bw": "90.82MB/s", + "reconnects": 587871, + "status_2xx": 5878301, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -407,19 +503,19 @@ "limited-conn-512": { "framework": "fulmine", "language": "JS", - "rps": 1032024, - "avg_latency": "486us", - "p99_latency": "2.19ms", - "cpu": "6147.7%", + "rps": 1096830, + "avg_latency": "456us", + "p99_latency": "2.03ms", + "cpu": "6156.2%", "memory": "2.6GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "180.07MB/s", - "input_bw": "79.72MB/s", - "reconnects": 516022, - "status_2xx": 5160123, + "bandwidth": "191.37MB/s", + "input_bw": "84.73MB/s", + "reconnects": 548409, + "status_2xx": 5484153, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -427,10 +523,10 @@ "pipelined-4096": { "framework": "fulmine", "language": "JS", - "rps": 7864864, + "rps": 7868038, "avg_latency": "8.33ms", - "p99_latency": "10.60ms", - "cpu": "6569.7%", + "p99_latency": "10.80ms", + "cpu": "6575.8%", "memory": "2.6GiB", "connections": 4096, "threads": 64, @@ -438,7 +534,7 @@ "pipeline": 16, "bandwidth": "1.34GB/s", "reconnects": 0, - "status_2xx": 39324320, + "status_2xx": 39340191, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -446,10 +542,10 @@ "pipelined-512": { "framework": "fulmine", "language": "JS", - "rps": 7896553, - "avg_latency": "1.04ms", - "p99_latency": "2.69ms", - "cpu": "6584.6%", + "rps": 7917830, + "avg_latency": "1.03ms", + "p99_latency": "2.52ms", + "cpu": "6580.3%", "memory": "2.5GiB", "connections": 512, "threads": 64, @@ -457,7 +553,7 @@ "pipeline": 16, "bandwidth": "1.35GB/s", "reconnects": 0, - "status_2xx": 39482768, + "status_2xx": 39589152, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -465,18 +561,18 @@ "static-1024": { "framework": "fulmine", "language": "JS", - "rps": 543570, + "rps": 540509, "avg_latency": "1.98ms", - "p99_latency": "23.95ms", - "cpu": "6509.7%", + "p99_latency": "25.80ms", + "cpu": "6505.3%", "memory": "3.9GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.34GB", + "bandwidth": "8.29GB", "reconnects": 0, - "status_2xx": 2772288, + "status_2xx": 2756630, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -484,18 +580,18 @@ "static-4096": { "framework": "fulmine", "language": "JS", - "rps": 588146, - "avg_latency": "7.00ms", - "p99_latency": "39.41ms", - "cpu": "6545.6%", - "memory": "7.3GiB", + "rps": 582701, + "avg_latency": "7.18ms", + "p99_latency": "45.49ms", + "cpu": "6498.8%", + "memory": "7.5GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "9.02GB", + "bandwidth": "8.94GB", "reconnects": 0, - "status_2xx": 2999266, + "status_2xx": 2972251, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -503,18 +599,75 @@ "static-6800": { "framework": "fulmine", "language": "JS", - "rps": 567798, - "avg_latency": "12.10ms", - "p99_latency": "60.03ms", - "cpu": "6487.7%", + "rps": 567379, + "avg_latency": "12.07ms", + "p99_latency": "58.06ms", + "cpu": "6558.9%", + "memory": "7.6GiB", + "connections": 6800, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "8.70GB", + "reconnects": 0, + "status_2xx": 2893919, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-tls-1024": { + "framework": "fulmine", + "language": "JS", + "rps": 432837, + "avg_latency": "2.42ms", + "p99_latency": "27.46ms", + "cpu": "6513.3%", + "memory": "3.7GiB", + "connections": 1024, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "6.64GB", + "reconnects": 0, + "status_2xx": 2207417, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-tls-4096": { + "framework": "fulmine", + "language": "JS", + "rps": 463875, + "avg_latency": "8.93ms", + "p99_latency": "74.99ms", + "cpu": "6457.0%", + "memory": "7.2GiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "7.11GB", + "reconnects": 0, + "status_2xx": 2365822, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "static-tls-6800": { + "framework": "fulmine", + "language": "JS", + "rps": 452587, + "avg_latency": "15.11ms", + "p99_latency": "147.50ms", + "cpu": "6380.7%", "memory": "7.6GiB", "connections": 6800, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.71GB", + "bandwidth": "6.94GB", "reconnects": 0, - "status_2xx": 2896595, + "status_2xx": 2305970, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -522,19 +675,19 @@ "upload-256": { "framework": "fulmine", "language": "JS", - "rps": 2129, - "avg_latency": "116.07ms", - "p99_latency": "922.30ms", - "cpu": "6107.8%", - "memory": "7.1GiB", + "rps": 2161, + "avg_latency": "113.50ms", + "p99_latency": "949.90ms", + "cpu": "6256.9%", + "memory": "7.5GiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "391.83KB/s", - "input_bw": "16.89GB/s", - "reconnects": 2109, - "status_2xx": 10667, + "bandwidth": "397.59KB/s", + "input_bw": "17.14GB/s", + "reconnects": 2159, + "status_2xx": 10830, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -542,19 +695,19 @@ "upload-32": { "framework": "fulmine", "language": "JS", - "rps": 2024, - "avg_latency": "15.75ms", - "p99_latency": "94.40ms", - "cpu": "2997.7%", + "rps": 2037, + "avg_latency": "15.69ms", + "p99_latency": "96.90ms", + "cpu": "3081.7%", "memory": "6.6GiB", "connections": 32, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "371.89KB/s", - "input_bw": "16.05GB/s", - "reconnects": 2022, - "status_2xx": 10120, + "bandwidth": "374.28KB/s", + "input_bw": "16.16GB/s", + "reconnects": 2041, + "status_2xx": 10187, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 diff --git a/site/static/logs/gateway-64/1024/fulmine.log b/site/static/logs/gateway-64/1024/fulmine.log new file mode 100644 index 000000000..ae9de49b5 --- /dev/null +++ b/site/static/logs/gateway-64/1024/fulmine.log @@ -0,0 +1 @@ +Error response from daemon: No such container: httparena-bench-fulmine diff --git a/site/static/logs/gateway-64/512/fulmine.log b/site/static/logs/gateway-64/512/fulmine.log new file mode 100644 index 000000000..ae9de49b5 --- /dev/null +++ b/site/static/logs/gateway-64/512/fulmine.log @@ -0,0 +1 @@ +Error response from daemon: No such container: httparena-bench-fulmine diff --git a/site/static/logs/gateway-h3/256/fulmine.log b/site/static/logs/gateway-h3/256/fulmine.log new file mode 100644 index 000000000..ae9de49b5 --- /dev/null +++ b/site/static/logs/gateway-h3/256/fulmine.log @@ -0,0 +1 @@ +Error response from daemon: No such container: httparena-bench-fulmine diff --git a/site/static/logs/gateway-h3/64/fulmine.log b/site/static/logs/gateway-h3/64/fulmine.log new file mode 100644 index 000000000..ae9de49b5 --- /dev/null +++ b/site/static/logs/gateway-h3/64/fulmine.log @@ -0,0 +1 @@ +Error response from daemon: No such container: httparena-bench-fulmine diff --git a/site/static/logs/static-tls/1024/fulmine.log b/site/static/logs/static-tls/1024/fulmine.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/static-tls/4096/fulmine.log b/site/static/logs/static-tls/4096/fulmine.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/static-tls/6800/fulmine.log b/site/static/logs/static-tls/6800/fulmine.log new file mode 100644 index 000000000..e69de29bb