Forge
sk

Forge / Linux · 17–18 Oct 2026

Benchmarks

Rovnaká práca, rovnaká záťaž. Preskúmajte zaznamenané merania, spoznajte metódu a zopakujte každý test.

192Dokončené merania
3Opakovania na scenár
0 / 0 / 0Chyby, timeouty alebo neúspešné odpovede
Node.js 24Kit: Node.js 24.15.0192 · Dokončené meraniaDokončené: 2026-10-18 13:56:39 UTC

Total.js 4 0.0.99 · Express 5.3.0 · Fastify 5.12.7 · generator 8.0.0 · Meteor 3.5.2 · AdonisJS 6.21.0 · NestJS · Express 12.1.3 · Total.js 5 0.0.19

Porovnajte ten istý scenár

RSS počas záťaže · MiB

Stĺpce ukazujú medián z troch opakovaní. Čiary ukazujú ich minimum a maximum. Pamäť je RSS procesu v MiB; každá os začína od nuly. Poradie frameworkov je pevné, nie je to rebríček.

RSS počas záťaže · MiB0.047.995.8143.7191.6Total.js 4: 159.3 [150.1–167.0]Total.js 4159.3Total.js 5: 165.7 [164.9–166.7]Total.js 5165.7Express: 90.8 [90.4–91.5]Express90.8Fastify: 91.2 [91.0–91.6]Fastify91.2Node.js http: 67.9 [67.5–69.8]Node.js http67.9Meteor: 168.6 [167.6–171.1]Meteor168.6AdonisJS: 145.3 [144.6–149.7]AdonisJS145.3NestJS · Express: 129.6 [129.4–130.0]NestJS · Express129.6
Všetky metriky tohto scenára
FrameworkVýchodiskový RSS · MiBRSS počas záťaže · MiBRSS po záťaži · MiBCPU · %Latencia p99 · msPokrytie cieľa · %Zdravé behy
Total.js 461.0 [60.9–61.1]159.3 [150.1–167.0]174.3 [172.9–174.5]7.9 [7.8–8.2]5.0 [5.0–5.0]100.0 [100.0–100.0]3/3
Total.js 562.8 [62.8–63.2]165.7 [164.9–166.7]173.8 [173.1–174.3]8.2 [8.1–8.2]6.0 [6.0–6.0]100.0 [100.0–100.0]3/3
Express74.1 [73.9–74.2]90.8 [90.4–91.5]90.9 [90.5–91.6]7.3 [7.1–7.6]5.0 [4.0–5.0]100.0 [100.0–100.0]3/3
Fastify75.9 [75.4–76.8]91.2 [91.0–91.6]91.2 [91.0–91.6]4.9 [4.9–5.0]3.0 [3.0–3.0]100.0 [100.0–100.0]3/3
Node.js http50.2 [50.2–50.2]67.9 [67.5–69.8]67.9 [67.7–70.0]4.4 [4.4–4.5]3.0 [3.0–3.0]100.0 [100.0–100.0]3/3
Meteor124.3 [123.4–125.5]168.6 [167.6–171.1]169.0 [168.5–172.3]12.8 [12.7–12.8]10.0 [8.0–18.0]100.0 [100.0–100.0]3/3
AdonisJS114.3 [113.6–115.4]145.3 [144.6–149.7]145.3 [144.6–149.6]10.7 [10.4–10.7]6.0 [6.0–7.0]100.0 [100.0–100.0]3/3
NestJS · Express100.4 [99.3–101.3]129.6 [129.4–130.0]129.8 [129.4–130.2]8.5 [8.5–8.6]5.0 [5.0–13.0]100.0 [100.0–100.0]3/3
Node.js
Total.js 4 · v24.14.1
Total.js 5 · v24.15.0
Express · v24.14.1
Fastify · v24.14.1
Node.js http · v24.14.1
Meteor · v24.15.0
AdonisJS · v24.15.0
NestJS · Express · v24.15.0

Hodnoty sú medián [minimum–maximum] z opakovaní. Každá hodnota RSS je medián v rámci fázy; vzorkované maximá zostávajú v surových dátach. Východisková hodnota nasleduje po kontrolných požiadavkách, takže nie je pamäťou úplne bez požiadaviek. CPU je percento jedného logického CPU počas vzorkovaného okna. p99 popisuje dokončené požiadavky; čítajte ho spolu s chybami a pokrytím cieľa.

Pamäť počas jedného merania

Jeden nový proces, vzorkovaný každú sekundu. Vyznačené okná označujú záťaž a zotavenie; pred záťažou prebieha zahrievanie a ustálenie. RSS zahŕňa runtime, heap a natívnu pamäť. Nie je to živý heap JavaScriptu.

Pamäť počas jedného merania · Total.js 5 · 10501001502000 s23 s45 s68 s90 s113 sMiB
RSSJS heapZáťažZotavenie

Stiahnuť kit a pripraviť počítač

Spustiť po príprave testovacieho kitu

docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/run.cjs --frameworks totaljs --workloads hello --rates 1000 --seconds 60 --warmup 15 --rest 30 --reps 3 --connections 32 --out /results/my-run.json

Príkaz používa zmrazenú sadu pre zvolený beh. Pred porovnaním opakovania zjednoťte hardvér, limity kontajnera a aktivitu na pozadí. Po dokončení overte príslušným v2/verify.cjs.

Ako čítať výsledok

Porovnávajte tú istú záťaž pri rovnakom cieľovom tempe a čítajte spolu latenciu, CPU, pamäť, chyby a pokrytie cieľa. Dôležitá je aj verzia runtime. Tieto merania nedokazujú, že jeden framework vždy spotrebuje menej zdrojov. Total.js 4 a 5 sú uvedené samostatne; každý používa svoju zaznamenanú implementáciu a runtime.

Čo sa meralo

Osem adaptérov, štyri záťaže a spoločné ciele 100 a 1 000 požiadaviek/s: 192 meraní. Každé meranie spúšťa nový produkčný proces: kontrola odpovede, 1,5 s východisko, 15 s zahrievanie, 6 s ustálenie, 60 s záťaž a 30 s zotavenie. Zachované sú všetky tri opakovania. Adaptéry sa merali postupne. Telá úspešných odpovedí sa kontrolujú pred záťažou aj po nej; generátor žiada až 32 spojení.

Total5 používa kompaktné NEWSCHEMA a priamy controller na validáciu JSON; malé odpovede JSON vracia priamo controller. Porovnanie obsahuje úplné zaznamenané scenáre, nikdy nie najlepší číselný výsledok. Meteor používa svoj produkčný bundle iba pre server; NestJS používa adaptér Express. Natívne validátory pokrývajú meraný obsah; odmietanie a konverzie sa môžu medzi frameworkmi líšiť.

Prostredie

Zdieľaný server Linux x64, Intel Core i7-6700. Každý kontajner merania bol obmedzený na 2 logické CPU a 2 GiB, bez vonkajšej siete a bez publikovaných portov. Generátor a simulovaná závislosť zdieľali kontajner. Node 24.14.1 sa použil pre Total4, Express, Fastify a Node http; Node 24.15.0 pre Total5, Meteor, AdonisJS a NestJS, v súlade s runtime bundlu Meteoru. Verzie runtime sú uvedené pri každom frameworku: rozdiely nemožno pripísať iba frameworku. Produkčné služby zostali na serveri.

Čo tieto výsledky nedokazujú

Ide o experiment s pevnou záťažou a uzavretou slučkou, nie o rebríček maximálnej priepustnosti. Dosiahnutie nastaveného cieľa nedokazuje, ako adaptér zvláda nezávislé príchody alebo nasýtenie. Došlo k určitému obmedzovaniu CPU kvótou, zaznamenanému v revízii. Tri krátke opakovania nedokazujú dlhodobú stabilitu, absenciu únikov pamäte, bezpečnosť v produkcii, správanie Flow ani využitie pamäte na Raspberry Pi. Nevynucovalo sa zber odpadu. RSS môže zostať alokované aj po skončení záťaže.

Bunka je zdravá, keď dokončené požiadavky dosiahnu aspoň 95 % cieľa × trvanie generátora, p99 nie je vyššie ako 250 ms a počty chýb, timeoutov a odpovedí mimo 2xx sú nulové. Tento prah netvrdí, že všetky majú rovnakú maximálnu kapacitu.

Pôvodné dôkazy

Revízia integrity a prostredia · Kontrolné súčty SHA-256 · JSON · Markdown

Reprodukovať a preveriť

Použite prázdny adresár s Dockerom (kontajnery Linux), curl a tar. Node.js na hostiteľovi nepotrebujete: kontrola kontrolného súčtu aj testy používajú Node 24.15.0 v Dockeri. Prvé zostavenie sťahuje závislosti a kompiluje Meteor, čo môže trvať niekoľko minút. Príprava vyžaduje internet; testovacie kontajnery nemajú vonkajšiu sieť. Každý meraný scenár trvá približne šesť minút.

Kit spúšťa všetkých osem adaptérov na Node v24.15.0. Publikované merania si zachovávajú pôvodné runtime, uvedené v tabuľke.

Stiahnuť kompletný testovací kit

1. Stiahnuť a pripraviť. Odkaz obsahuje spúšťač, adaptéry a zámky závislostí; nie je potrebná inštalácia Forge ani klonovanie repozitára. V prázdnom adresári spustite nasledujúce príkazy. Ak ste stiahli tlačidlom, ponechajte názov sources.tar.gz a vynechajte curl.

curl --fail --location --output sources.tar.gz 'https://forge.totaljs.es/benchmarks/node-24.15.0/sources.tar.gz' &&
docker run --rm --platform linux/amd64 --network none -v "$PWD:/kit:ro" node:24.15.0-bookworm node -e 'const fs=require("node:fs"),crypto=require("node:crypto");if(crypto.createHash("sha256").update(fs.readFileSync("/kit/sources.tar.gz")).digest("hex")!=="65801cd865a3fc961e69ba8df421ed198acdc399d29934714fb954e4de1db651")throw Error("SHA-256 mismatch");' &&
tar -xzf sources.tar.gz &&
docker build --platform linux/amd64 -t forge-benchmark-local . &&
mkdir -p results

2. Skontrolovať inštaláciu (približne 15–30 sekúnd). Tento krátky test vytvorí smoke.json a overí jeho zaznamenané vstupy; nie je to publikovateľný výkonnostný výsledok.

docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/run.cjs --smoke --frameworks totaljs --workloads hello --rates 1000 --out /results/smoke.json
docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/verify.cjs /results/smoke.json --allow-smoke

3. Spustiť a overiť zvolené meranie. Výsledky sa uložia do results/my-run.json vo zvolenom adresári benchmarks. Spúšťač odmieta prepísať existujúci výstup: pri opakovaní použite iný názov súboru. Overenie kontroluje úplnosť a vstupy, nie zhodu s publikovanými hodnotami.

docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/run.cjs --frameworks totaljs --workloads hello --rates 1000 --seconds 60 --warmup 15 --rest 30 --reps 3 --connections 32 --out /results/my-run.json
docker run --rm --platform linux/amd64 --cpus 2 --memory 2g --memory-swap 2g --pids-limit 256 --read-only --network none --user "$(id -u):$(id -g)" --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 -v "$PWD/results:/results" forge-benchmark-local node benchmarks/v2/verify.cjs /results/my-run.json