From 0de21638c7baabe90bd480acc1758c2c0b66c0bb Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Fri, 7 Aug 2026 14:31:45 +0200 Subject: [PATCH 01/10] Bump fulmine to 5.3.0 --- 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 a7b331ac4..b0e69cb68 100644 --- a/frameworks/fulmine/package.json +++ b/frameworks/fulmine/package.json @@ -2,7 +2,7 @@ "name": "httparena-fulmine", "private": true, "dependencies": { - "fulmine.js": "^5.2.0", + "fulmine.js": "^5.3.0", "pg": "^8.13.0", "pg-native": "^3.8.0", "ioredis": "^5.4.1" From 7d035ca8037185f4f398c6423c0df38a5a847335 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Fri, 7 Aug 2026 14:59:12 +0200 Subject: [PATCH 02/10] Use @redis/client with its client-side cache, and build the crud headers once --- frameworks/fulmine/app.js | 44 +++++++++++++++++++++++++++------ frameworks/fulmine/package.json | 2 +- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/frameworks/fulmine/app.js b/frameworks/fulmine/app.js index 2dc4b98dd..614b8de02 100644 --- a/frameworks/fulmine/app.js +++ b/frameworks/fulmine/app.js @@ -29,6 +29,10 @@ if (cluster.isPrimary) { app.set('etag', false); const SERVER_HDR = { 'server': 'fulmine' }; + // built once: the crud read path spread SERVER_HDR into a new object on every request, which + // is two allocations per read on the busiest route this entry has + const CACHE_HIT_HDR = { 'server': 'fulmine', 'x-cache': 'HIT' }; + const CACHE_MISS_HDR = { 'server': 'fulmine', 'x-cache': 'MISS' }; // Dataset let datasetItems; @@ -60,15 +64,29 @@ if (cluster.isPrimary) { // CRUD cache. The sidecar Redis when the harness provides one: with one process per // core an in-process map would fragment the working set 64 ways and barely ever hit. // The cached value is the serialized body, so a HIT skips re-serialization too. + const CRUD_TTL_MS = 200; let redis; if (process.env.REDIS_URL) { try { - const Redis = require('ioredis'); - redis = new Redis(process.env.REDIS_URL, { enableAutoPipelining: true }); - redis.on('error', () => {}); + const { createClient } = require('@redis/client'); + const client = createClient({ + url: process.env.REDIS_URL, + // RESP3, because that is what carries the invalidation messages the cache below + // is kept honest by + RESP: 3, + // the read-through cache node-redis keeps in this process: a HIT is answered here + // and costs no round trip at all, and Redis tells this client when what it holds + // stops being true. Bounded and LRU because there is one process per core, and + // sixty-four unbounded caches would be the working-set problem the sidecar solved + clientSideCache: { ttl: CRUD_TTL_MS, maxEntries: 4096, evictPolicy: 'LRU' } + }); + client.on('error', () => {}); + // a promise here, where ioredis connected in the background. Until it settles the map + // below answers, which is what happens with no sidecar at all: a cache that is not + // ready yet is a miss, never an error + client.connect().then(() => { redis = client; }, () => {}); } catch (e) {} } - const CRUD_TTL_MS = 200; const crudCache = new Map(); const crudGet = (id) => { if (redis) return redis.get('crud:' + id); @@ -77,12 +95,22 @@ if (cluster.isPrimary) { if (hit.until <= Date.now()) { crudCache.delete(id); return null; } return hit.json; }; + // dropped from this process too, and after the write rather than before it: the invalidation + // Redis pushes is a round trip away, and a read on this same connection right after the write + // must not beat it home + const forget = (id) => { + if (redis.clientSideCache) redis.clientSideCache.invalidate('crud:' + id); + }; const crudSet = (id, json) => { - if (redis) return redis.set('crud:' + id, json, 'PX', CRUD_TTL_MS); + if (redis) { + return redis + .set('crud:' + id, json, { expiration: { type: 'PX', value: CRUD_TTL_MS } }) + .then((reply) => { forget(id); return reply; }); + } crudCache.set(id, { json, until: Date.now() + CRUD_TTL_MS }); }; const crudDel = (id) => { - if (redis) return redis.del('crud:' + id); + if (redis) return redis.del('crud:' + id).then((reply) => { forget(id); return reply; }); crudCache.delete(id); }; @@ -230,7 +258,7 @@ if (cluster.isPrimary) { try { const cached = await crudGet(id); if (cached) { - return res.set({ ...SERVER_HDR, 'x-cache': 'HIT' }).type('application/json').send(cached); + return res.set(CACHE_HIT_HDR).type('application/json').send(cached); } const result = await pgPool.query({ name: 'crud-read', @@ -240,7 +268,7 @@ if (cluster.isPrimary) { if (result.rows.length === 0) return res.status(404).set(SERVER_HDR).end(); const json = JSON.stringify(itemShape(result.rows[0])); crudSet(id, json); - res.set({ ...SERVER_HDR, 'x-cache': 'MISS' }).type('application/json').send(json); + res.set(CACHE_MISS_HDR).type('application/json').send(json); } catch (e) { res.status(500).set(SERVER_HDR).type('application/json').send('{"error":"query failed"}'); } diff --git a/frameworks/fulmine/package.json b/frameworks/fulmine/package.json index b0e69cb68..9f33f39cd 100644 --- a/frameworks/fulmine/package.json +++ b/frameworks/fulmine/package.json @@ -5,6 +5,6 @@ "fulmine.js": "^5.3.0", "pg": "^8.13.0", "pg-native": "^3.8.0", - "ioredis": "^5.4.1" + "@redis/client": "^6.2.0" } } From 8651672092edb5dc1365e84a5e5550bab956ed2c Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Fri, 7 Aug 2026 15:06:06 +0200 Subject: [PATCH 03/10] Join the body chunks as buffers, so a split character survives --- frameworks/fulmine/app.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/frameworks/fulmine/app.js b/frameworks/fulmine/app.js index 614b8de02..4cce8d81c 100644 --- a/frameworks/fulmine/app.js +++ b/frameworks/fulmine/app.js @@ -114,12 +114,19 @@ if (cluster.isPrimary) { crudCache.delete(id); }; - // one shape for the two body-carrying crud verbs, read the way the other POST routes read + // one shape for the two body-carrying crud verbs, read the way the other POST routes read. + // + // The chunks are kept as buffers and joined at the end rather than added to a string as they + // arrive. Adding them decodes each chunk on its own, so a character whose UTF-8 bytes are split + // across two chunks becomes a replacement character on both sides of the cut. Nothing complains: + // the body still parses, it just no longer says what was sent. Measured against express.json() + // on this shape, the two are the same speed, so the hand-rolled reader is kept only because it + // answers a bad body with the empty 400 the profile expects. function readJsonBody(req, cb) { - let body = ''; - req.on('data', chunk => body += chunk); + const chunks = []; + req.on('data', chunk => chunks.push(chunk)); req.on('end', () => { - try { cb(null, JSON.parse(body)); } catch (e) { cb(e); } + try { cb(null, JSON.parse(Buffer.concat(chunks).toString('utf8'))); } catch (e) { cb(e); } }); } From 5ab78319bff18a601c72c8cb0f3d09f1ada86f7b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 7 Aug 2026 13:45:50 +0000 Subject: [PATCH 04/10] Benchmark results: fulmine [skip ci] --- site/data/results/fulmine.json | 432 ++++++++++++++++----------------- 1 file changed, 216 insertions(+), 216 deletions(-) diff --git a/site/data/results/fulmine.json b/site/data/results/fulmine.json index 4f93bf977..82bbf072b 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": 123624, - "avg_latency": "6.62ms", - "p99_latency": "44.70ms", - "cpu": "1511.1%", + "rps": 129162, + "avg_latency": "6.26ms", + "p99_latency": "42.70ms", + "cpu": "1554.7%", "memory": "1.9GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "630.93MB/s", - "input_bw": "6.96MB/s", - "reconnects": 370838, - "status_2xx": 1854364, + "bandwidth": "659.26MB/s", + "input_bw": "7.27MB/s", + "reconnects": 387525, + "status_2xx": 1937434, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 695264, - "tpl_json": 695518, + "tpl_baseline": 726314, + "tpl_json": 726685, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 463581 + "tpl_async_db": 484433 }, "api-4-256": { "framework": "fulmine", "language": "JS", - "rps": 35750, - "avg_latency": "6.08ms", - "p99_latency": "30.80ms", - "cpu": "395.0%", - "memory": "500MiB", + "rps": 35403, + "avg_latency": "6.03ms", + "p99_latency": "32.50ms", + "cpu": "389.4%", + "memory": "508MiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "182.36MB/s", - "input_bw": "2.01MB/s", - "reconnects": 107272, - "status_2xx": 536260, + "bandwidth": "180.64MB/s", + "input_bw": "1.99MB/s", + "reconnects": 106203, + "status_2xx": 531048, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 201228, - "tpl_json": 201051, + "tpl_baseline": 199179, + "tpl_json": 199110, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 133981 + "tpl_async_db": 132758 }, "async-db-1024": { "framework": "fulmine", "language": "JS", - "rps": 226950, - "avg_latency": "3.92ms", - "p99_latency": "39.90ms", - "cpu": "5663.1%", - "memory": "6.9GiB", + "rps": 236060, + "avg_latency": "3.79ms", + "p99_latency": "28.80ms", + "cpu": "5855.3%", + "memory": "7.0GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "883.42MB/s", - "input_bw": "15.15MB/s", - "reconnects": 90689, - "status_2xx": 2269507, + "bandwidth": "918.78MB/s", + "input_bw": "15.76MB/s", + "reconnects": 94359, + "status_2xx": 2360609, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -76,19 +76,19 @@ "baseline-4096": { "framework": "fulmine", "language": "JS", - "rps": 1210412, - "avg_latency": "3.38ms", - "p99_latency": "5.21ms", - "cpu": "6640.1%", - "memory": "5.9GiB", + "rps": 1202481, + "avg_latency": "3.41ms", + "p99_latency": "5.48ms", + "cpu": "6777.0%", + "memory": "7.7GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "211.19MB/s", - "input_bw": "93.50MB/s", + "bandwidth": "209.81MB/s", + "input_bw": "92.89MB/s", "reconnects": 0, - "status_2xx": 6052062, + "status_2xx": 6012409, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -96,19 +96,19 @@ "baseline-512": { "framework": "fulmine", "language": "JS", - "rps": 1226235, + "rps": 1225488, "avg_latency": "417us", - "p99_latency": "1.16ms", - "cpu": "6758.6%", - "memory": "5.9GiB", + "p99_latency": "1.11ms", + "cpu": "6815.6%", + "memory": "7.6GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "213.95MB/s", - "input_bw": "94.72MB/s", + "bandwidth": "213.82MB/s", + "input_bw": "94.67MB/s", "reconnects": 0, - "status_2xx": 6131178, + "status_2xx": 6127440, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -116,19 +116,19 @@ "crud-4096": { "framework": "fulmine", "language": "JS", - "rps": 352481, - "avg_latency": "11.56ms", - "p99_latency": "21.20ms", - "cpu": "4502.0%", - "memory": "8.1GiB", + "rps": 210973, + "avg_latency": "19.41ms", + "p99_latency": "43.90ms", + "cpu": "3236.6%", + "memory": "11.2GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "138.64MB/s", - "input_bw": "30.25MB/s", - "reconnects": 23825, - "status_2xx": 5287216, + "bandwidth": "83.76MB/s", + "input_bw": "18.11MB/s", + "reconnects": 14121, + "status_2xx": 3164605, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -136,18 +136,18 @@ "echo-ws-16384": { "framework": "fulmine", "language": "JS", - "rps": 3568966, - "avg_latency": "4.57ms", - "p99_latency": "9.04ms", - "cpu": "6477.4%", - "memory": "2.4GiB", + "rps": 3586702, + "avg_latency": "4.54ms", + "p99_latency": "8.93ms", + "cpu": "6503.4%", + "memory": "2.5GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "24.34MB/s", + "bandwidth": "24.45MB/s", "reconnects": 0, - "status_2xx": 17844833, + "status_2xx": 17933510, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -155,18 +155,18 @@ "echo-ws-4096": { "framework": "fulmine", "language": "JS", - "rps": 3767961, + "rps": 3768441, "avg_latency": "1.09ms", "p99_latency": "2.31ms", - "cpu": "6357.6%", - "memory": "2.3GiB", + "cpu": "6379.4%", + "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "25.15MB/s", + "bandwidth": "25.19MB/s", "reconnects": 0, - "status_2xx": 18839805, + "status_2xx": 18842208, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -174,18 +174,18 @@ "echo-ws-512": { "framework": "fulmine", "language": "JS", - "rps": 3732298, - "avg_latency": "136us", - "p99_latency": "348us", - "cpu": "6539.8%", + "rps": 3707047, + "avg_latency": "137us", + "p99_latency": "349us", + "cpu": "6445.1%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "24.91MB/s", + "bandwidth": "24.75MB/s", "reconnects": 0, - "status_2xx": 18661491, + "status_2xx": 18535237, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -193,18 +193,18 @@ "echo-ws-limited-4096": { "framework": "fulmine", "language": "JS", - "rps": 2558298, - "avg_latency": "1.05ms", - "p99_latency": "2.87ms", - "cpu": "6231.7%", + "rps": 2570787, + "avg_latency": "1.06ms", + "p99_latency": "2.95ms", + "cpu": "6246.0%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "57.58MB/s", - "reconnects": 1279587, - "status_2xx": 12791493, + "bandwidth": "57.92MB/s", + "reconnects": 1284262, + "status_2xx": 12853935, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -212,18 +212,18 @@ "echo-ws-limited-512": { "framework": "fulmine", "language": "JS", - "rps": 2096400, + "rps": 2082245, "avg_latency": "149us", - "p99_latency": "544us", - "cpu": "5614.2%", + "p99_latency": "561us", + "cpu": "5481.8%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "47.17MB/s", - "reconnects": 1048221, - "status_2xx": 10482002, + "bandwidth": "46.85MB/s", + "reconnects": 1041137, + "status_2xx": 10411225, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -231,18 +231,18 @@ "echo-ws-pipeline-16384": { "framework": "fulmine", "language": "JS", - "rps": 23750396, - "avg_latency": "10.88ms", - "p99_latency": "14.90ms", - "cpu": "6374.6%", - "memory": "2.5GiB", + "rps": 23550083, + "avg_latency": "10.93ms", + "p99_latency": "15.10ms", + "cpu": "6333.6%", + "memory": "2.6GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "159.02MB/s", + "bandwidth": "157.69MB/s", "reconnects": 0, - "status_2xx": 118751984, + "status_2xx": 117750416, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -250,18 +250,18 @@ "echo-ws-pipeline-4096": { "framework": "fulmine", "language": "JS", - "rps": 24903491, - "avg_latency": "2.63ms", - "p99_latency": "5.29ms", - "cpu": "6608.8%", + "rps": 25021235, + "avg_latency": "2.62ms", + "p99_latency": "5.03ms", + "cpu": "6631.2%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "166.28MB/s", + "bandwidth": "167.01MB/s", "reconnects": 0, - "status_2xx": 124517456, + "status_2xx": 125106176, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -269,18 +269,18 @@ "echo-ws-pipeline-512": { "framework": "fulmine", "language": "JS", - "rps": 24928716, - "avg_latency": "327us", - "p99_latency": "883us", - "cpu": "6811.8%", + "rps": 24603148, + "avg_latency": "332us", + "p99_latency": "944us", + "cpu": "6787.3%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "166.38MB/s", + "bandwidth": "164.20MB/s", "reconnects": 0, - "status_2xx": 124643584, + "status_2xx": 123015743, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -288,19 +288,19 @@ "json-4096": { "framework": "fulmine", "language": "JS", - "rps": 1112194, - "avg_latency": "3.32ms", - "p99_latency": "10.10ms", - "cpu": "6441.4%", - "memory": "6.4GiB", + "rps": 1145533, + "avg_latency": "3.22ms", + "p99_latency": "10.00ms", + "cpu": "6636.1%", + "memory": "6.7GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.84GB/s", - "input_bw": "53.03MB/s", - "reconnects": 221113, - "status_2xx": 5560971, + "bandwidth": "3.96GB/s", + "input_bw": "54.62MB/s", + "reconnects": 228276, + "status_2xx": 5727666, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -308,19 +308,19 @@ "json-comp-16384": { "framework": "fulmine", "language": "JS", - "rps": 438511, - "avg_latency": "37.00ms", - "p99_latency": "89.30ms", - "cpu": "6331.1%", - "memory": "10.4GiB", + "rps": 433927, + "avg_latency": "37.37ms", + "p99_latency": "90.90ms", + "cpu": "6320.4%", + "memory": "10.7GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "684.72MB/s", - "input_bw": "32.62MB/s", - "reconnects": 80696, - "status_2xx": 2192558, + "bandwidth": "677.66MB/s", + "input_bw": "32.28MB/s", + "reconnects": 80016, + "status_2xx": 2169638, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -328,19 +328,19 @@ "json-comp-4096": { "framework": "fulmine", "language": "JS", - "rps": 428453, - "avg_latency": "9.54ms", - "p99_latency": "32.40ms", - "cpu": "6381.9%", - "memory": "9.1GiB", + "rps": 417359, + "avg_latency": "9.79ms", + "p99_latency": "33.00ms", + "cpu": "6406.8%", + "memory": "9.2GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "669.13MB/s", - "input_bw": "31.87MB/s", - "reconnects": 83941, - "status_2xx": 2142269, + "bandwidth": "651.79MB/s", + "input_bw": "31.05MB/s", + "reconnects": 81701, + "status_2xx": 2086798, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -348,19 +348,19 @@ "json-comp-512": { "framework": "fulmine", "language": "JS", - "rps": 426738, - "avg_latency": "1.20ms", - "p99_latency": "8.61ms", - "cpu": "6052.0%", - "memory": "7.7GiB", + "rps": 409597, + "avg_latency": "1.25ms", + "p99_latency": "7.06ms", + "cpu": "6243.9%", + "memory": "8.7GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "666.51MB/s", - "input_bw": "31.74MB/s", - "reconnects": 85336, - "status_2xx": 2133693, + "bandwidth": "639.61MB/s", + "input_bw": "30.47MB/s", + "reconnects": 81922, + "status_2xx": 2047987, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -368,18 +368,18 @@ "json-tls-4096": { "framework": "fulmine", "language": "JS", - "rps": 1046604, - "avg_latency": "3.89ms", - "p99_latency": "48.53ms", - "cpu": "6583.8%", - "memory": "6.6GiB", + "rps": 1085015, + "avg_latency": "3.76ms", + "p99_latency": "63.50ms", + "cpu": "6587.8%", + "memory": "6.5GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.62GB", + "bandwidth": "3.75GB", "reconnects": 0, - "status_2xx": 5337756, + "status_2xx": 5530998, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -387,19 +387,19 @@ "limited-conn-4096": { "framework": "fulmine", "language": "JS", - "rps": 1100364, + "rps": 1101872, "avg_latency": "3.71ms", - "p99_latency": "15.50ms", - "cpu": "6633.5%", - "memory": "7.6GiB", + "p99_latency": "15.40ms", + "cpu": "6637.7%", + "memory": "7.7GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "191.99MB/s", - "input_bw": "85.00MB/s", - "reconnects": 549848, - "status_2xx": 5501821, + "bandwidth": "192.25MB/s", + "input_bw": "85.12MB/s", + "reconnects": 551465, + "status_2xx": 5509361, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -407,19 +407,19 @@ "limited-conn-512": { "framework": "fulmine", "language": "JS", - "rps": 1033273, + "rps": 1034112, "avg_latency": "485us", - "p99_latency": "2.27ms", - "cpu": "6146.1%", - "memory": "7.5GiB", + "p99_latency": "2.20ms", + "cpu": "6140.0%", + "memory": "7.6GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "180.28MB/s", - "input_bw": "79.82MB/s", - "reconnects": 516640, - "status_2xx": 5166368, + "bandwidth": "180.43MB/s", + "input_bw": "79.88MB/s", + "reconnects": 517063, + "status_2xx": 5170561, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -427,18 +427,18 @@ "pipelined-4096": { "framework": "fulmine", "language": "JS", - "rps": 7335952, - "avg_latency": "8.93ms", - "p99_latency": "11.80ms", - "cpu": "6548.7%", - "memory": "6.5GiB", + "rps": 7720147, + "avg_latency": "8.49ms", + "p99_latency": "11.60ms", + "cpu": "6555.0%", + "memory": "6.8GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "1.25GB/s", + "bandwidth": "1.32GB/s", "reconnects": 0, - "status_2xx": 36679760, + "status_2xx": 38600736, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -446,18 +446,18 @@ "pipelined-512": { "framework": "fulmine", "language": "JS", - "rps": 7378288, - "avg_latency": "1.11ms", - "p99_latency": "2.77ms", - "cpu": "6565.3%", - "memory": "6.0GiB", + "rps": 7745305, + "avg_latency": "1.06ms", + "p99_latency": "2.87ms", + "cpu": "6571.4%", + "memory": "6.2GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "1.26GB/s", + "bandwidth": "1.32GB/s", "reconnects": 0, - "status_2xx": 36891440, + "status_2xx": 38726528, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -465,18 +465,18 @@ "static-1024": { "framework": "fulmine", "language": "JS", - "rps": 536370, + "rps": 538479, "avg_latency": "2.01ms", - "p99_latency": "24.01ms", - "cpu": "6506.6%", - "memory": "7.3GiB", + "p99_latency": "27.81ms", + "cpu": "6524.5%", + "memory": "7.2GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.23GB", + "bandwidth": "8.26GB", "reconnects": 0, - "status_2xx": 2735556, + "status_2xx": 2746317, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -484,18 +484,18 @@ "static-4096": { "framework": "fulmine", "language": "JS", - "rps": 579762, - "avg_latency": "7.12ms", - "p99_latency": "48.26ms", - "cpu": "6506.1%", - "memory": "7.4GiB", + "rps": 573270, + "avg_latency": "7.28ms", + "p99_latency": "46.54ms", + "cpu": "6527.6%", + "memory": "7.9GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.89GB", + "bandwidth": "8.79GB", "reconnects": 0, - "status_2xx": 2956429, + "status_2xx": 2923946, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -503,18 +503,18 @@ "static-6800": { "framework": "fulmine", "language": "JS", - "rps": 558317, - "avg_latency": "12.26ms", - "p99_latency": "83.82ms", - "cpu": "6511.6%", + "rps": 564169, + "avg_latency": "12.14ms", + "p99_latency": "63.83ms", + "cpu": "6467.5%", "memory": "8.2GiB", "connections": 6800, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.56GB", + "bandwidth": "8.65GB", "reconnects": 0, - "status_2xx": 2848118, + "status_2xx": 2877934, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -522,19 +522,19 @@ "upload-256": { "framework": "fulmine", "language": "JS", - "rps": 2137, - "avg_latency": "116.17ms", - "p99_latency": "917.40ms", - "cpu": "6038.0%", - "memory": "7.1GiB", + "rps": 2130, + "avg_latency": "115.58ms", + "p99_latency": "961.00ms", + "cpu": "6334.2%", + "memory": "7.0GiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "393.24KB/s", - "input_bw": "16.95GB/s", - "reconnects": 2117, - "status_2xx": 10711, + "bandwidth": "391.89KB/s", + "input_bw": "16.89GB/s", + "reconnects": 2121, + "status_2xx": 10672, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -542,19 +542,19 @@ "upload-32": { "framework": "fulmine", "language": "JS", - "rps": 2041, - "avg_latency": "15.64ms", - "p99_latency": "91.70ms", - "cpu": "3071.1%", - "memory": "6.8GiB", + "rps": 2038, + "avg_latency": "15.65ms", + "p99_latency": "90.50ms", + "cpu": "3100.2%", + "memory": "6.5GiB", "connections": 32, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "375.00KB/s", - "input_bw": "16.19GB/s", - "reconnects": 2040, - "status_2xx": 10205, + "bandwidth": "374.55KB/s", + "input_bw": "16.16GB/s", + "reconnects": 2042, + "status_2xx": 10192, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 From 475ed4e27c4326f9818a668d0b3e3f5cec2fa857 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Fri, 7 Aug 2026 16:02:05 +0200 Subject: [PATCH 05/10] Go back to ioredis: the client-side cache cost crud 40% of its throughput --- frameworks/fulmine/app.js | 40 +++++++++------------------------ frameworks/fulmine/package.json | 2 +- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/frameworks/fulmine/app.js b/frameworks/fulmine/app.js index 4cce8d81c..11cf43c7a 100644 --- a/frameworks/fulmine/app.js +++ b/frameworks/fulmine/app.js @@ -68,25 +68,17 @@ if (cluster.isPrimary) { let redis; if (process.env.REDIS_URL) { try { - const { createClient } = require('@redis/client'); - const client = createClient({ - url: process.env.REDIS_URL, - // RESP3, because that is what carries the invalidation messages the cache below - // is kept honest by - RESP: 3, - // the read-through cache node-redis keeps in this process: a HIT is answered here - // and costs no round trip at all, and Redis tells this client when what it holds - // stops being true. Bounded and LRU because there is one process per core, and - // sixty-four unbounded caches would be the working-set problem the sidecar solved - clientSideCache: { ttl: CRUD_TTL_MS, maxEntries: 4096, evictPolicy: 'LRU' } - }); - client.on('error', () => {}); - // a promise here, where ioredis connected in the background. Until it settles the map - // below answers, which is what happens with no sidecar at all: a cache that is not - // ready yet is a miss, never an error - client.connect().then(() => { redis = client; }, () => {}); + const Redis = require('ioredis'); + redis = new Redis(process.env.REDIS_URL, { enableAutoPipelining: true }); + redis.on('error', () => {}); } catch (e) {} } + // @redis/client with its server-assisted client-side cache was measured here and is not worth + // having: crud went from 352k to 211k rps, p99 from 21ms to 44ms, and the CPU this entry used + // *fell* from 4502% to 3237% with no failed request, so the processes were waiting rather than + // working. That is the shape of a bottleneck that moved into Redis: tracking makes it hold an + // invalidation table per key per client and push a message to all sixty-four of them whenever + // one writes, and this test writes on every cache miss. const crudCache = new Map(); const crudGet = (id) => { if (redis) return redis.get('crud:' + id); @@ -95,22 +87,12 @@ if (cluster.isPrimary) { if (hit.until <= Date.now()) { crudCache.delete(id); return null; } return hit.json; }; - // dropped from this process too, and after the write rather than before it: the invalidation - // Redis pushes is a round trip away, and a read on this same connection right after the write - // must not beat it home - const forget = (id) => { - if (redis.clientSideCache) redis.clientSideCache.invalidate('crud:' + id); - }; const crudSet = (id, json) => { - if (redis) { - return redis - .set('crud:' + id, json, { expiration: { type: 'PX', value: CRUD_TTL_MS } }) - .then((reply) => { forget(id); return reply; }); - } + if (redis) return redis.set('crud:' + id, json, 'PX', CRUD_TTL_MS); crudCache.set(id, { json, until: Date.now() + CRUD_TTL_MS }); }; const crudDel = (id) => { - if (redis) return redis.del('crud:' + id).then((reply) => { forget(id); return reply; }); + if (redis) return redis.del('crud:' + id); crudCache.delete(id); }; diff --git a/frameworks/fulmine/package.json b/frameworks/fulmine/package.json index 9f33f39cd..b0e69cb68 100644 --- a/frameworks/fulmine/package.json +++ b/frameworks/fulmine/package.json @@ -5,6 +5,6 @@ "fulmine.js": "^5.3.0", "pg": "^8.13.0", "pg-native": "^3.8.0", - "@redis/client": "^6.2.0" + "ioredis": "^5.4.1" } } From 416855a8220c10d3e47445350ff93d431adbd827 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Fri, 7 Aug 2026 18:34:51 +0200 Subject: [PATCH 06/10] Bump fulmine to 5.4.0 --- 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 b0e69cb68..73409a62b 100644 --- a/frameworks/fulmine/package.json +++ b/frameworks/fulmine/package.json @@ -2,7 +2,7 @@ "name": "httparena-fulmine", "private": true, "dependencies": { - "fulmine.js": "^5.3.0", + "fulmine.js": "^5.4.0", "pg": "^8.13.0", "pg-native": "^3.8.0", "ioredis": "^5.4.1" From 890f11461d46c6cef9708036eafdd6e6c4580d1c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 7 Aug 2026 17:52:00 +0000 Subject: [PATCH 07/10] Benchmark results: fulmine [skip ci] --- site/data/results/fulmine.json | 440 ++++++++++++++++----------------- 1 file changed, 220 insertions(+), 220 deletions(-) diff --git a/site/data/results/fulmine.json b/site/data/results/fulmine.json index 82bbf072b..4aee94259 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": 129162, - "avg_latency": "6.26ms", - "p99_latency": "42.70ms", - "cpu": "1554.7%", - "memory": "1.9GiB", + "rps": 126921, + "avg_latency": "6.49ms", + "p99_latency": "42.10ms", + "cpu": "1556.1%", + "memory": "1.2GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "659.26MB/s", - "input_bw": "7.27MB/s", - "reconnects": 387525, - "status_2xx": 1937434, + "bandwidth": "647.92MB/s", + "input_bw": "7.14MB/s", + "reconnects": 380766, + "status_2xx": 1903829, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 726314, - "tpl_json": 726685, + "tpl_baseline": 713526, + "tpl_json": 714352, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 484433 + "tpl_async_db": 475950 }, "api-4-256": { "framework": "fulmine", "language": "JS", - "rps": 35403, - "avg_latency": "6.03ms", - "p99_latency": "32.50ms", - "cpu": "389.4%", - "memory": "508MiB", + "rps": 34674, + "avg_latency": "5.96ms", + "p99_latency": "31.20ms", + "cpu": "393.6%", + "memory": "403MiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "180.64MB/s", - "input_bw": "1.99MB/s", - "reconnects": 106203, - "status_2xx": 531048, + "bandwidth": "176.88MB/s", + "input_bw": "1.95MB/s", + "reconnects": 104050, + "status_2xx": 520121, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 199179, - "tpl_json": 199110, + "tpl_baseline": 195187, + "tpl_json": 194987, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 132758 + "tpl_async_db": 129947 }, "async-db-1024": { "framework": "fulmine", "language": "JS", - "rps": 236060, - "avg_latency": "3.79ms", - "p99_latency": "28.80ms", - "cpu": "5855.3%", - "memory": "7.0GiB", + "rps": 228797, + "avg_latency": "3.86ms", + "p99_latency": "28.00ms", + "cpu": "5870.9%", + "memory": "4.1GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "918.78MB/s", - "input_bw": "15.76MB/s", - "reconnects": 94359, - "status_2xx": 2360609, + "bandwidth": "890.40MB/s", + "input_bw": "15.27MB/s", + "reconnects": 91446, + "status_2xx": 2287974, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -76,19 +76,19 @@ "baseline-4096": { "framework": "fulmine", "language": "JS", - "rps": 1202481, - "avg_latency": "3.41ms", - "p99_latency": "5.48ms", - "cpu": "6777.0%", - "memory": "7.7GiB", + "rps": 1106235, + "avg_latency": "3.70ms", + "p99_latency": "5.08ms", + "cpu": "6588.8%", + "memory": "2.6GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "209.81MB/s", - "input_bw": "92.89MB/s", + "bandwidth": "193.01MB/s", + "input_bw": "85.45MB/s", "reconnects": 0, - "status_2xx": 6012409, + "status_2xx": 5531178, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -96,19 +96,19 @@ "baseline-512": { "framework": "fulmine", "language": "JS", - "rps": 1225488, - "avg_latency": "417us", - "p99_latency": "1.11ms", - "cpu": "6815.6%", - "memory": "7.6GiB", + "rps": 1128115, + "avg_latency": "453us", + "p99_latency": "1.10ms", + "cpu": "6762.7%", + "memory": "2.6GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "213.82MB/s", - "input_bw": "94.67MB/s", + "bandwidth": "196.83MB/s", + "input_bw": "87.14MB/s", "reconnects": 0, - "status_2xx": 6127440, + "status_2xx": 5640578, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -116,19 +116,19 @@ "crud-4096": { "framework": "fulmine", "language": "JS", - "rps": 210973, - "avg_latency": "19.41ms", - "p99_latency": "43.90ms", - "cpu": "3236.6%", - "memory": "11.2GiB", + "rps": 357052, + "avg_latency": "11.40ms", + "p99_latency": "21.90ms", + "cpu": "4458.0%", + "memory": "8.0GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "83.76MB/s", - "input_bw": "18.11MB/s", - "reconnects": 14121, - "status_2xx": 3164605, + "bandwidth": "141.68MB/s", + "input_bw": "30.65MB/s", + "reconnects": 24853, + "status_2xx": 5355786, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -136,18 +136,18 @@ "echo-ws-16384": { "framework": "fulmine", "language": "JS", - "rps": 3586702, + "rps": 3587532, "avg_latency": "4.54ms", - "p99_latency": "8.93ms", - "cpu": "6503.4%", + "p99_latency": "8.98ms", + "cpu": "6497.5%", "memory": "2.5GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "24.45MB/s", + "bandwidth": "24.46MB/s", "reconnects": 0, - "status_2xx": 17933510, + "status_2xx": 17937661, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -155,18 +155,18 @@ "echo-ws-4096": { "framework": "fulmine", "language": "JS", - "rps": 3768441, - "avg_latency": "1.09ms", - "p99_latency": "2.31ms", - "cpu": "6379.4%", + "rps": 3781001, + "avg_latency": "1.08ms", + "p99_latency": "2.30ms", + "cpu": "6545.8%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "25.19MB/s", + "bandwidth": "25.28MB/s", "reconnects": 0, - "status_2xx": 18842208, + "status_2xx": 18905006, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -174,18 +174,18 @@ "echo-ws-512": { "framework": "fulmine", "language": "JS", - "rps": 3707047, + "rps": 3713621, "avg_latency": "137us", - "p99_latency": "349us", - "cpu": "6445.1%", + "p99_latency": "360us", + "cpu": "6436.3%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "24.75MB/s", + "bandwidth": "24.78MB/s", "reconnects": 0, - "status_2xx": 18535237, + "status_2xx": 18568105, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -193,18 +193,18 @@ "echo-ws-limited-4096": { "framework": "fulmine", "language": "JS", - "rps": 2570787, - "avg_latency": "1.06ms", - "p99_latency": "2.95ms", - "cpu": "6246.0%", + "rps": 2567800, + "avg_latency": "1.05ms", + "p99_latency": "2.90ms", + "cpu": "6250.3%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "57.92MB/s", - "reconnects": 1284262, - "status_2xx": 12853935, + "bandwidth": "57.78MB/s", + "reconnects": 1284380, + "status_2xx": 12839000, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -212,18 +212,18 @@ "echo-ws-limited-512": { "framework": "fulmine", "language": "JS", - "rps": 2082245, - "avg_latency": "149us", - "p99_latency": "561us", - "cpu": "5481.8%", - "memory": "2.3GiB", + "rps": 2086949, + "avg_latency": "147us", + "p99_latency": "536us", + "cpu": "5568.7%", + "memory": "2.4GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "46.85MB/s", - "reconnects": 1041137, - "status_2xx": 10411225, + "bandwidth": "46.96MB/s", + "reconnects": 1043488, + "status_2xx": 10434748, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -231,18 +231,18 @@ "echo-ws-pipeline-16384": { "framework": "fulmine", "language": "JS", - "rps": 23550083, - "avg_latency": "10.93ms", - "p99_latency": "15.10ms", - "cpu": "6333.6%", + "rps": 23840864, + "avg_latency": "10.81ms", + "p99_latency": "14.50ms", + "cpu": "6349.7%", "memory": "2.6GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "157.69MB/s", + "bandwidth": "159.62MB/s", "reconnects": 0, - "status_2xx": 117750416, + "status_2xx": 119204320, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -250,18 +250,18 @@ "echo-ws-pipeline-4096": { "framework": "fulmine", "language": "JS", - "rps": 25021235, + "rps": 25011145, "avg_latency": "2.62ms", - "p99_latency": "5.03ms", - "cpu": "6631.2%", + "p99_latency": "5.26ms", + "cpu": "6603.9%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "167.01MB/s", + "bandwidth": "166.93MB/s", "reconnects": 0, - "status_2xx": 125106176, + "status_2xx": 125055728, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -269,18 +269,18 @@ "echo-ws-pipeline-512": { "framework": "fulmine", "language": "JS", - "rps": 24603148, - "avg_latency": "332us", - "p99_latency": "944us", - "cpu": "6787.3%", + "rps": 24733760, + "avg_latency": "330us", + "p99_latency": "931us", + "cpu": "6791.5%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "164.20MB/s", + "bandwidth": "165.07MB/s", "reconnects": 0, - "status_2xx": 123015743, + "status_2xx": 123668800, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -288,19 +288,19 @@ "json-4096": { "framework": "fulmine", "language": "JS", - "rps": 1145533, - "avg_latency": "3.22ms", - "p99_latency": "10.00ms", - "cpu": "6636.1%", - "memory": "6.7GiB", + "rps": 1061146, + "avg_latency": "3.52ms", + "p99_latency": "10.80ms", + "cpu": "6655.1%", + "memory": "2.6GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.96GB/s", - "input_bw": "54.62MB/s", - "reconnects": 228276, - "status_2xx": 5727666, + "bandwidth": "3.66GB/s", + "input_bw": "50.60MB/s", + "reconnects": 210664, + "status_2xx": 5305730, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -308,19 +308,19 @@ "json-comp-16384": { "framework": "fulmine", "language": "JS", - "rps": 433927, - "avg_latency": "37.37ms", - "p99_latency": "90.90ms", - "cpu": "6320.4%", - "memory": "10.7GiB", + "rps": 423202, + "avg_latency": "38.26ms", + "p99_latency": "90.60ms", + "cpu": "6330.7%", + "memory": "10.5GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "677.66MB/s", - "input_bw": "32.28MB/s", - "reconnects": 80016, - "status_2xx": 2169638, + "bandwidth": "660.85MB/s", + "input_bw": "31.48MB/s", + "reconnects": 77984, + "status_2xx": 2116010, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -328,19 +328,19 @@ "json-comp-4096": { "framework": "fulmine", "language": "JS", - "rps": 417359, - "avg_latency": "9.79ms", - "p99_latency": "33.00ms", - "cpu": "6406.8%", - "memory": "9.2GiB", + "rps": 411258, + "avg_latency": "9.93ms", + "p99_latency": "33.40ms", + "cpu": "6400.2%", + "memory": "9.0GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "651.79MB/s", - "input_bw": "31.05MB/s", - "reconnects": 81701, - "status_2xx": 2086798, + "bandwidth": "642.23MB/s", + "input_bw": "30.59MB/s", + "reconnects": 80567, + "status_2xx": 2056293, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -348,19 +348,19 @@ "json-comp-512": { "framework": "fulmine", "language": "JS", - "rps": 409597, - "avg_latency": "1.25ms", - "p99_latency": "7.06ms", - "cpu": "6243.9%", - "memory": "8.7GiB", + "rps": 400205, + "avg_latency": "1.27ms", + "p99_latency": "7.58ms", + "cpu": "6223.2%", + "memory": "8.5GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "639.61MB/s", - "input_bw": "30.47MB/s", - "reconnects": 81922, - "status_2xx": 2047987, + "bandwidth": "624.97MB/s", + "input_bw": "29.77MB/s", + "reconnects": 80034, + "status_2xx": 2001027, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -368,18 +368,18 @@ "json-tls-4096": { "framework": "fulmine", "language": "JS", - "rps": 1085015, - "avg_latency": "3.76ms", - "p99_latency": "63.50ms", - "cpu": "6587.8%", - "memory": "6.5GiB", + "rps": 994024, + "avg_latency": "4.09ms", + "p99_latency": "56.35ms", + "cpu": "6601.1%", + "memory": "2.6GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.75GB", + "bandwidth": "3.43GB", "reconnects": 0, - "status_2xx": 5530998, + "status_2xx": 5069478, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -387,19 +387,19 @@ "limited-conn-4096": { "framework": "fulmine", "language": "JS", - "rps": 1101872, - "avg_latency": "3.71ms", - "p99_latency": "15.40ms", - "cpu": "6637.7%", - "memory": "7.7GiB", + "rps": 1017734, + "avg_latency": "4.01ms", + "p99_latency": "16.70ms", + "cpu": "6450.8%", + "memory": "2.7GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "192.25MB/s", - "input_bw": "85.12MB/s", - "reconnects": 551465, - "status_2xx": 5509361, + "bandwidth": "177.57MB/s", + "input_bw": "78.62MB/s", + "reconnects": 508139, + "status_2xx": 5088670, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -407,19 +407,19 @@ "limited-conn-512": { "framework": "fulmine", "language": "JS", - "rps": 1034112, - "avg_latency": "485us", - "p99_latency": "2.20ms", - "cpu": "6140.0%", - "memory": "7.6GiB", + "rps": 957714, + "avg_latency": "525us", + "p99_latency": "2.39ms", + "cpu": "6215.6%", + "memory": "2.6GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "180.43MB/s", - "input_bw": "79.88MB/s", - "reconnects": 517063, - "status_2xx": 5170561, + "bandwidth": "167.10MB/s", + "input_bw": "73.98MB/s", + "reconnects": 478843, + "status_2xx": 4788571, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -427,18 +427,18 @@ "pipelined-4096": { "framework": "fulmine", "language": "JS", - "rps": 7720147, - "avg_latency": "8.49ms", - "p99_latency": "11.60ms", - "cpu": "6555.0%", - "memory": "6.8GiB", + "rps": 7882640, + "avg_latency": "8.31ms", + "p99_latency": "10.90ms", + "cpu": "6564.7%", + "memory": "2.6GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "1.32GB/s", + "bandwidth": "1.34GB/s", "reconnects": 0, - "status_2xx": 38600736, + "status_2xx": 39413200, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -446,18 +446,18 @@ "pipelined-512": { "framework": "fulmine", "language": "JS", - "rps": 7745305, - "avg_latency": "1.06ms", - "p99_latency": "2.87ms", - "cpu": "6571.4%", - "memory": "6.2GiB", + "rps": 7896176, + "avg_latency": "1.04ms", + "p99_latency": "2.56ms", + "cpu": "6579.7%", + "memory": "2.5GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "1.32GB/s", + "bandwidth": "1.35GB/s", "reconnects": 0, - "status_2xx": 38726528, + "status_2xx": 39480880, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -465,18 +465,18 @@ "static-1024": { "framework": "fulmine", "language": "JS", - "rps": 538479, - "avg_latency": "2.01ms", - "p99_latency": "27.81ms", - "cpu": "6524.5%", - "memory": "7.2GiB", + "rps": 541909, + "avg_latency": "1.98ms", + "p99_latency": "26.14ms", + "cpu": "6513.4%", + "memory": "3.7GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.26GB", + "bandwidth": "8.31GB", "reconnects": 0, - "status_2xx": 2746317, + "status_2xx": 2763788, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -484,18 +484,18 @@ "static-4096": { "framework": "fulmine", "language": "JS", - "rps": 573270, - "avg_latency": "7.28ms", - "p99_latency": "46.54ms", - "cpu": "6527.6%", - "memory": "7.9GiB", + "rps": 585570, + "avg_latency": "7.05ms", + "p99_latency": "48.59ms", + "cpu": "6512.9%", + "memory": "7.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.79GB", + "bandwidth": "8.98GB", "reconnects": 0, - "status_2xx": 2923946, + "status_2xx": 2986593, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -503,18 +503,18 @@ "static-6800": { "framework": "fulmine", "language": "JS", - "rps": 564169, - "avg_latency": "12.14ms", - "p99_latency": "63.83ms", - "cpu": "6467.5%", - "memory": "8.2GiB", + "rps": 570414, + "avg_latency": "12.01ms", + "p99_latency": "60.25ms", + "cpu": "6500.2%", + "memory": "7.7GiB", "connections": 6800, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.65GB", + "bandwidth": "8.75GB", "reconnects": 0, - "status_2xx": 2877934, + "status_2xx": 2909319, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -522,19 +522,19 @@ "upload-256": { "framework": "fulmine", "language": "JS", - "rps": 2130, - "avg_latency": "115.58ms", - "p99_latency": "961.00ms", - "cpu": "6334.2%", - "memory": "7.0GiB", + "rps": 2140, + "avg_latency": "114.33ms", + "p99_latency": "925.80ms", + "cpu": "6313.2%", + "memory": "7.1GiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "391.89KB/s", - "input_bw": "16.89GB/s", - "reconnects": 2121, - "status_2xx": 10672, + "bandwidth": "393.90KB/s", + "input_bw": "16.97GB/s", + "reconnects": 2131, + "status_2xx": 10726, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -542,19 +542,19 @@ "upload-32": { "framework": "fulmine", "language": "JS", - "rps": 2038, - "avg_latency": "15.65ms", - "p99_latency": "90.50ms", - "cpu": "3100.2%", - "memory": "6.5GiB", + "rps": 2040, + "avg_latency": "15.62ms", + "p99_latency": "93.20ms", + "cpu": "3058.9%", + "memory": "6.7GiB", "connections": 32, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "374.55KB/s", - "input_bw": "16.16GB/s", - "reconnects": 2042, - "status_2xx": 10192, + "bandwidth": "374.83KB/s", + "input_bw": "16.18GB/s", + "reconnects": 2040, + "status_2xx": 10203, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 From c1865c98798d5d510353be0dc26552466410bb6d Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Sat, 8 Aug 2026 06:59:40 +0200 Subject: [PATCH 08/10] Bump fulmine to 5.4.1 --- 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 73409a62b..12f147c5f 100644 --- a/frameworks/fulmine/package.json +++ b/frameworks/fulmine/package.json @@ -2,7 +2,7 @@ "name": "httparena-fulmine", "private": true, "dependencies": { - "fulmine.js": "^5.4.0", + "fulmine.js": "^5.4.1", "pg": "^8.13.0", "pg-native": "^3.8.0", "ioredis": "^5.4.1" From d829078bf6292f0c17599c8b1d791389a2a35cd4 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Sat, 8 Aug 2026 08:21:00 +0200 Subject: [PATCH 09/10] Bump fulmine to 5.5.0 --- 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 12f147c5f..183d49a26 100644 --- a/frameworks/fulmine/package.json +++ b/frameworks/fulmine/package.json @@ -2,7 +2,7 @@ "name": "httparena-fulmine", "private": true, "dependencies": { - "fulmine.js": "^5.4.1", + "fulmine.js": "^5.5.0", "pg": "^8.13.0", "pg-native": "^3.8.0", "ioredis": "^5.4.1" From 8b24bb315ac25d84bc28a5267a0a12ae334917c2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 8 Aug 2026 08:38:21 +0000 Subject: [PATCH 10/10] Benchmark results: fulmine [skip ci] --- site/data/results/fulmine.json | 410 ++++++++++++++++----------------- 1 file changed, 205 insertions(+), 205 deletions(-) diff --git a/site/data/results/fulmine.json b/site/data/results/fulmine.json index 4aee94259..cb05c2101 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": 126921, - "avg_latency": "6.49ms", - "p99_latency": "42.10ms", - "cpu": "1556.1%", + "rps": 129658, + "avg_latency": "6.14ms", + "p99_latency": "42.80ms", + "cpu": "1542.9%", "memory": "1.2GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "647.92MB/s", - "input_bw": "7.14MB/s", - "reconnects": 380766, - "status_2xx": 1903829, + "bandwidth": "661.67MB/s", + "input_bw": "7.30MB/s", + "reconnects": 388853, + "status_2xx": 1944876, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 713526, - "tpl_json": 714352, + "tpl_baseline": 729380, + "tpl_json": 729721, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 475950 + "tpl_async_db": 485774 }, "api-4-256": { "framework": "fulmine", "language": "JS", - "rps": 34674, - "avg_latency": "5.96ms", - "p99_latency": "31.20ms", - "cpu": "393.6%", - "memory": "403MiB", + "rps": 35639, + "avg_latency": "5.89ms", + "p99_latency": "31.30ms", + "cpu": "393.3%", + "memory": "425MiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "176.88MB/s", - "input_bw": "1.95MB/s", - "reconnects": 104050, - "status_2xx": 520121, + "bandwidth": "181.83MB/s", + "input_bw": "2.01MB/s", + "reconnects": 106930, + "status_2xx": 534593, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0, - "tpl_baseline": 195187, - "tpl_json": 194987, + "tpl_baseline": 200532, + "tpl_json": 200430, "tpl_db": 0, "tpl_upload": 0, "tpl_static": 0, - "tpl_async_db": 129947 + "tpl_async_db": 133631 }, "async-db-1024": { "framework": "fulmine", "language": "JS", - "rps": 228797, - "avg_latency": "3.86ms", - "p99_latency": "28.00ms", - "cpu": "5870.9%", - "memory": "4.1GiB", + "rps": 224285, + "avg_latency": "4.05ms", + "p99_latency": "20.00ms", + "cpu": "5942.1%", + "memory": "3.6GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "890.40MB/s", - "input_bw": "15.27MB/s", - "reconnects": 91446, - "status_2xx": 2287974, + "bandwidth": "872.77MB/s", + "input_bw": "14.97MB/s", + "reconnects": 89382, + "status_2xx": 2242851, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -76,19 +76,19 @@ "baseline-4096": { "framework": "fulmine", "language": "JS", - "rps": 1106235, - "avg_latency": "3.70ms", - "p99_latency": "5.08ms", - "cpu": "6588.8%", + "rps": 1212009, + "avg_latency": "3.38ms", + "p99_latency": "4.54ms", + "cpu": "6776.3%", "memory": "2.6GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "193.01MB/s", - "input_bw": "85.45MB/s", + "bandwidth": "211.45MB/s", + "input_bw": "93.62MB/s", "reconnects": 0, - "status_2xx": 5531178, + "status_2xx": 6060046, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -96,19 +96,19 @@ "baseline-512": { "framework": "fulmine", "language": "JS", - "rps": 1128115, - "avg_latency": "453us", - "p99_latency": "1.10ms", - "cpu": "6762.7%", + "rps": 1230527, + "avg_latency": "415us", + "p99_latency": "1.04ms", + "cpu": "6816.6%", "memory": "2.6GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "196.83MB/s", - "input_bw": "87.14MB/s", + "bandwidth": "214.57MB/s", + "input_bw": "95.06MB/s", "reconnects": 0, - "status_2xx": 5640578, + "status_2xx": 6152639, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -116,19 +116,19 @@ "crud-4096": { "framework": "fulmine", "language": "JS", - "rps": 357052, - "avg_latency": "11.40ms", - "p99_latency": "21.90ms", - "cpu": "4458.0%", + "rps": 357460, + "avg_latency": "11.41ms", + "p99_latency": "20.70ms", + "cpu": "4430.6%", "memory": "8.0GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "141.68MB/s", - "input_bw": "30.65MB/s", - "reconnects": 24853, - "status_2xx": 5355786, + "bandwidth": "141.76MB/s", + "input_bw": "30.68MB/s", + "reconnects": 24824, + "status_2xx": 5361909, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -136,18 +136,18 @@ "echo-ws-16384": { "framework": "fulmine", "language": "JS", - "rps": 3587532, - "avg_latency": "4.54ms", - "p99_latency": "8.98ms", - "cpu": "6497.5%", + "rps": 3577210, + "avg_latency": "4.57ms", + "p99_latency": "9.15ms", + "cpu": "6232.0%", "memory": "2.5GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "24.46MB/s", + "bandwidth": "24.38MB/s", "reconnects": 0, - "status_2xx": 17937661, + "status_2xx": 17886053, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -155,18 +155,18 @@ "echo-ws-4096": { "framework": "fulmine", "language": "JS", - "rps": 3781001, + "rps": 3768590, "avg_latency": "1.08ms", - "p99_latency": "2.30ms", - "cpu": "6545.8%", + "p99_latency": "2.27ms", + "cpu": "6547.5%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "25.28MB/s", + "bandwidth": "25.19MB/s", "reconnects": 0, - "status_2xx": 18905006, + "status_2xx": 18842950, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -174,18 +174,18 @@ "echo-ws-512": { "framework": "fulmine", "language": "JS", - "rps": 3713621, - "avg_latency": "137us", - "p99_latency": "360us", - "cpu": "6436.3%", + "rps": 3726934, + "avg_latency": "136us", + "p99_latency": "409us", + "cpu": "6467.6%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "24.78MB/s", + "bandwidth": "24.88MB/s", "reconnects": 0, - "status_2xx": 18568105, + "status_2xx": 18634673, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -193,18 +193,18 @@ "echo-ws-limited-4096": { "framework": "fulmine", "language": "JS", - "rps": 2567800, - "avg_latency": "1.05ms", - "p99_latency": "2.90ms", - "cpu": "6250.3%", + "rps": 2564958, + "avg_latency": "1.06ms", + "p99_latency": "2.85ms", + "cpu": "6043.9%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "57.78MB/s", - "reconnects": 1284380, - "status_2xx": 12839000, + "bandwidth": "57.75MB/s", + "reconnects": 1281697, + "status_2xx": 12824793, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -212,18 +212,18 @@ "echo-ws-limited-512": { "framework": "fulmine", "language": "JS", - "rps": 2086949, + "rps": 2089072, "avg_latency": "147us", - "p99_latency": "536us", - "cpu": "5568.7%", - "memory": "2.4GiB", + "p99_latency": "531us", + "cpu": "5617.6%", + "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "46.96MB/s", - "reconnects": 1043488, - "status_2xx": 10434748, + "bandwidth": "47.01MB/s", + "reconnects": 1044563, + "status_2xx": 10445364, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -231,18 +231,18 @@ "echo-ws-pipeline-16384": { "framework": "fulmine", "language": "JS", - "rps": 23840864, - "avg_latency": "10.81ms", - "p99_latency": "14.50ms", - "cpu": "6349.7%", + "rps": 23866108, + "avg_latency": "10.79ms", + "p99_latency": "14.60ms", + "cpu": "6339.2%", "memory": "2.6GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "159.62MB/s", + "bandwidth": "159.80MB/s", "reconnects": 0, - "status_2xx": 119204320, + "status_2xx": 119330544, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -250,18 +250,18 @@ "echo-ws-pipeline-4096": { "framework": "fulmine", "language": "JS", - "rps": 25011145, + "rps": 24928886, "avg_latency": "2.62ms", - "p99_latency": "5.26ms", - "cpu": "6603.9%", + "p99_latency": "5.50ms", + "cpu": "6589.2%", "memory": "2.4GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "166.93MB/s", + "bandwidth": "166.45MB/s", "reconnects": 0, - "status_2xx": 125055728, + "status_2xx": 124644432, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -269,18 +269,18 @@ "echo-ws-pipeline-512": { "framework": "fulmine", "language": "JS", - "rps": 24733760, - "avg_latency": "330us", - "p99_latency": "931us", - "cpu": "6791.5%", + "rps": 24949417, + "avg_latency": "327us", + "p99_latency": "848us", + "cpu": "6817.8%", "memory": "2.3GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 16, - "bandwidth": "165.07MB/s", + "bandwidth": "166.53MB/s", "reconnects": 0, - "status_2xx": 123668800, + "status_2xx": 124747088, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -288,19 +288,19 @@ "json-4096": { "framework": "fulmine", "language": "JS", - "rps": 1061146, - "avg_latency": "3.52ms", - "p99_latency": "10.80ms", - "cpu": "6655.1%", + "rps": 1141097, + "avg_latency": "3.23ms", + "p99_latency": "9.76ms", + "cpu": "6649.7%", "memory": "2.6GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.66GB/s", - "input_bw": "50.60MB/s", - "reconnects": 210664, - "status_2xx": 5305730, + "bandwidth": "3.94GB/s", + "input_bw": "54.41MB/s", + "reconnects": 226622, + "status_2xx": 5705485, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -308,19 +308,19 @@ "json-comp-16384": { "framework": "fulmine", "language": "JS", - "rps": 423202, - "avg_latency": "38.26ms", - "p99_latency": "90.60ms", - "cpu": "6330.7%", - "memory": "10.5GiB", + "rps": 438127, + "avg_latency": "36.98ms", + "p99_latency": "87.60ms", + "cpu": "6312.7%", + "memory": "10.6GiB", "connections": 16384, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "660.85MB/s", - "input_bw": "31.48MB/s", - "reconnects": 77984, - "status_2xx": 2116010, + "bandwidth": "684.18MB/s", + "input_bw": "32.59MB/s", + "reconnects": 80813, + "status_2xx": 2190635, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -328,19 +328,19 @@ "json-comp-4096": { "framework": "fulmine", "language": "JS", - "rps": 411258, - "avg_latency": "9.93ms", - "p99_latency": "33.40ms", - "cpu": "6400.2%", - "memory": "9.0GiB", + "rps": 425219, + "avg_latency": "9.61ms", + "p99_latency": "31.50ms", + "cpu": "6419.6%", + "memory": "9.2GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "642.23MB/s", - "input_bw": "30.59MB/s", - "reconnects": 80567, - "status_2xx": 2056293, + "bandwidth": "663.98MB/s", + "input_bw": "31.63MB/s", + "reconnects": 83547, + "status_2xx": 2126097, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -348,19 +348,19 @@ "json-comp-512": { "framework": "fulmine", "language": "JS", - "rps": 400205, - "avg_latency": "1.27ms", - "p99_latency": "7.58ms", - "cpu": "6223.2%", - "memory": "8.5GiB", + "rps": 412239, + "avg_latency": "1.24ms", + "p99_latency": "7.18ms", + "cpu": "6227.9%", + "memory": "8.7GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "624.97MB/s", - "input_bw": "29.77MB/s", - "reconnects": 80034, - "status_2xx": 2001027, + "bandwidth": "643.76MB/s", + "input_bw": "30.67MB/s", + "reconnects": 82462, + "status_2xx": 2061195, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -368,18 +368,18 @@ "json-tls-4096": { "framework": "fulmine", "language": "JS", - "rps": 994024, - "avg_latency": "4.09ms", - "p99_latency": "56.35ms", - "cpu": "6601.1%", + "rps": 1076647, + "avg_latency": "3.77ms", + "p99_latency": "42.11ms", + "cpu": "6586.0%", "memory": "2.6GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "3.43GB", + "bandwidth": "3.72GB", "reconnects": 0, - "status_2xx": 5069478, + "status_2xx": 5489512, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -387,19 +387,19 @@ "limited-conn-4096": { "framework": "fulmine", "language": "JS", - "rps": 1017734, - "avg_latency": "4.01ms", - "p99_latency": "16.70ms", - "cpu": "6450.8%", + "rps": 1102548, + "avg_latency": "3.70ms", + "p99_latency": "15.50ms", + "cpu": "6412.2%", "memory": "2.7GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "177.57MB/s", - "input_bw": "78.62MB/s", - "reconnects": 508139, - "status_2xx": 5088670, + "bandwidth": "192.37MB/s", + "input_bw": "85.17MB/s", + "reconnects": 549730, + "status_2xx": 5512740, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -407,19 +407,19 @@ "limited-conn-512": { "framework": "fulmine", "language": "JS", - "rps": 957714, - "avg_latency": "525us", - "p99_latency": "2.39ms", - "cpu": "6215.6%", + "rps": 1032024, + "avg_latency": "486us", + "p99_latency": "2.19ms", + "cpu": "6147.7%", "memory": "2.6GiB", "connections": 512, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "167.10MB/s", - "input_bw": "73.98MB/s", - "reconnects": 478843, - "status_2xx": 4788571, + "bandwidth": "180.07MB/s", + "input_bw": "79.72MB/s", + "reconnects": 516022, + "status_2xx": 5160123, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -427,10 +427,10 @@ "pipelined-4096": { "framework": "fulmine", "language": "JS", - "rps": 7882640, - "avg_latency": "8.31ms", - "p99_latency": "10.90ms", - "cpu": "6564.7%", + "rps": 7864864, + "avg_latency": "8.33ms", + "p99_latency": "10.60ms", + "cpu": "6569.7%", "memory": "2.6GiB", "connections": 4096, "threads": 64, @@ -438,7 +438,7 @@ "pipeline": 16, "bandwidth": "1.34GB/s", "reconnects": 0, - "status_2xx": 39413200, + "status_2xx": 39324320, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -446,10 +446,10 @@ "pipelined-512": { "framework": "fulmine", "language": "JS", - "rps": 7896176, + "rps": 7896553, "avg_latency": "1.04ms", - "p99_latency": "2.56ms", - "cpu": "6579.7%", + "p99_latency": "2.69ms", + "cpu": "6584.6%", "memory": "2.5GiB", "connections": 512, "threads": 64, @@ -457,7 +457,7 @@ "pipeline": 16, "bandwidth": "1.35GB/s", "reconnects": 0, - "status_2xx": 39480880, + "status_2xx": 39482768, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -465,18 +465,18 @@ "static-1024": { "framework": "fulmine", "language": "JS", - "rps": 541909, + "rps": 543570, "avg_latency": "1.98ms", - "p99_latency": "26.14ms", - "cpu": "6513.4%", - "memory": "3.7GiB", + "p99_latency": "23.95ms", + "cpu": "6509.7%", + "memory": "3.9GiB", "connections": 1024, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.31GB", + "bandwidth": "8.34GB", "reconnects": 0, - "status_2xx": 2763788, + "status_2xx": 2772288, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -484,18 +484,18 @@ "static-4096": { "framework": "fulmine", "language": "JS", - "rps": 585570, - "avg_latency": "7.05ms", - "p99_latency": "48.59ms", - "cpu": "6512.9%", - "memory": "7.4GiB", + "rps": 588146, + "avg_latency": "7.00ms", + "p99_latency": "39.41ms", + "cpu": "6545.6%", + "memory": "7.3GiB", "connections": 4096, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.98GB", + "bandwidth": "9.02GB", "reconnects": 0, - "status_2xx": 2986593, + "status_2xx": 2999266, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -503,18 +503,18 @@ "static-6800": { "framework": "fulmine", "language": "JS", - "rps": 570414, - "avg_latency": "12.01ms", - "p99_latency": "60.25ms", - "cpu": "6500.2%", - "memory": "7.7GiB", + "rps": 567798, + "avg_latency": "12.10ms", + "p99_latency": "60.03ms", + "cpu": "6487.7%", + "memory": "7.6GiB", "connections": 6800, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "8.75GB", + "bandwidth": "8.71GB", "reconnects": 0, - "status_2xx": 2909319, + "status_2xx": 2896595, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -522,19 +522,19 @@ "upload-256": { "framework": "fulmine", "language": "JS", - "rps": 2140, - "avg_latency": "114.33ms", - "p99_latency": "925.80ms", - "cpu": "6313.2%", + "rps": 2129, + "avg_latency": "116.07ms", + "p99_latency": "922.30ms", + "cpu": "6107.8%", "memory": "7.1GiB", "connections": 256, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "393.90KB/s", - "input_bw": "16.97GB/s", - "reconnects": 2131, - "status_2xx": 10726, + "bandwidth": "391.83KB/s", + "input_bw": "16.89GB/s", + "reconnects": 2109, + "status_2xx": 10667, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0 @@ -542,19 +542,19 @@ "upload-32": { "framework": "fulmine", "language": "JS", - "rps": 2040, - "avg_latency": "15.62ms", - "p99_latency": "93.20ms", - "cpu": "3058.9%", - "memory": "6.7GiB", + "rps": 2024, + "avg_latency": "15.75ms", + "p99_latency": "94.40ms", + "cpu": "2997.7%", + "memory": "6.6GiB", "connections": 32, "threads": 64, "duration": "5s", "pipeline": 1, - "bandwidth": "374.83KB/s", - "input_bw": "16.18GB/s", - "reconnects": 2040, - "status_2xx": 10203, + "bandwidth": "371.89KB/s", + "input_bw": "16.05GB/s", + "reconnects": 2022, + "status_2xx": 10120, "status_3xx": 0, "status_4xx": 0, "status_5xx": 0