Skip to content

Bump fulmine to 5.5.0 - #1085

Merged
MDA2AV merged 11 commits into
MDA2AV:mainfrom
nigrosimone:bump-fulmine-530
Aug 8, 2026
Merged

Bump fulmine to 5.5.0#1085
MDA2AV merged 11 commits into
MDA2AV:mainfrom
nigrosimone:bump-fulmine-530

Conversation

@nigrosimone

Copy link
Copy Markdown
Contributor

Pin bump for the fulmine entry, from ^5.2.0 to ^5.3.0 (changelog).

The release is mostly compatibility work: 27 fixes, nearly all of them found by a differential fuzzer that builds random applications and compares the answers against real Express. Nothing there should move a benchmark row.

Four changes do touch the request path, each measured on our own rig against the previous revision, so I have no prediction for yours:

  • the response arms its two internal listeners by writing the event map directly instead of calling on() twice, -6.9% CPU per request on a hello-world
  • the request no longer builds a Readable until something asks for one, -5.2% and -5.5% over two runs
  • an IPv4-mapped peer address is read straight out of the bytes rather than through the general IPv6 formatter, which shows on anything that reads req.ip
  • a chain steps over a body parser when the request declared no body and the verb reads none, which removes a hop rather than shortening one

No entry files change other than the pin.

@nigrosimone

Copy link
Copy Markdown
Contributor Author

C:/Program Files/Git/benchmark -f fulmine --save

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

👋 /benchmark request received. A collaborator will review and approve the run.

@nigrosimone

Copy link
Copy Markdown
Contributor Author

Sorry, my shell rewrote the leading slash in the comment above into a Windows path. The command I meant:

/benchmark -f fulmine --save

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

👋 /benchmark request received. A collaborator will review and approve the run.

@nigrosimone

Copy link
Copy Markdown
Contributor Author

Pushed a second commit, so this PR is now the pin bump plus a change to the crud cache. Happy to split it if you would rather review them apart.

ioredis@redis/client, with the cache it can keep in the process. The client is created with RESP: 3 and clientSideCache: { ttl: 200, maxEntries: 4096, evictPolicy: 'LRU' }. A cache HIT is then answered inside the worker with no round trip, and Redis pushes the invalidation when a key stops being true, so the sidecar still owns correctness. The cache is bounded and LRU on purpose: there is one process per core, and 64 unbounded caches would be the working-set problem the sidecar was introduced to solve.

Two details that needed care:

  • connect() is a promise here, where ioredis connected in the background. Until it settles the in-process map answers, which is what already happened when the harness provided no sidecar: a cache that is not ready is a miss, never an error. Verified with a client pointed at a dead port: the fallback holds and nothing is left unhandled.
  • a write drops the key 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 the same connection immediately after the write must not beat it home.

enableAutoPipelining has no counterpart because node-redis has no such switch: it queues commands and flushes them on setImmediate, so pipelining is not optional there.

The crud read path built its headers per request. res.set({ ...SERVER_HDR, 'x-cache': 'HIT' }) is two allocations on the busiest route the entry has. They are two constants now.

Smoke tested in Docker against postgres 17 and redis 7 with the items table seeded: read MISS then HIT on the same connection, 404 for an id that is not there, list by category, POST upsert 201, and PUT followed by a read that comes back MISS with the new values, which is the invalidation doing its job. What I could not run here is scripts/validate.sh: it needs --network host, which Docker Desktop does not expose to a Windows host.

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: fulmine | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,225,488 6815.6% 7.6GiB ~0% +28.8%
baseline 4096 1,202,481 6777.0% 7.7GiB -0.7% +30.5%
pipelined 512 7,745,305 6571.4% 6.2GiB +5.0% +3.3%
pipelined 4096 7,720,147 6555.0% 6.8GiB +5.2% +4.6%
limited-conn 512 1,034,112 6140.0% 7.6GiB ~0% +1.3%
limited-conn 4096 1,101,872 6637.7% 7.7GiB +0.1% +1.3%
json 4096 1,145,533 6636.1% 6.7GiB +3.0% +4.7%
json-comp 512 409,597 6243.9% 8.7GiB -4.0% +13.0%
json-comp 4096 417,359 6406.8% 9.2GiB -2.6% +1.1%
json-comp 16384 433,927 6320.4% 10.7GiB -1.0% +2.9%
json-tls 4096 1,085,015 6587.8% 6.5GiB +3.7% -1.5%
upload 32 2,038 3100.2% 6.5GiB -0.1% -4.4%
upload 256 2,130 6334.2% 7.0GiB -0.3% -1.4%
api-4 256 35,403 389.4% 508MiB -1.0% +1.6%
api-16 1024 129,162 1554.7% 1.9GiB +4.5% ~0%
static 1024 538,479 6524.5% 7.2GiB +0.4% -1.4%
static 4096 573,270 6527.6% 7.9GiB -1.1% +6.8%
static 6800 564,169 6467.5% 8.2GiB +1.0% ~0%
async-db 1024 236,060 5855.3% 7.0GiB +4.0% +1.4%
crud 4096 210,973 3236.6% 11.2GiB -40.1% +38.3%
echo-ws 512 3,707,047 6445.1% 2.3GiB -0.7% ~0%
echo-ws 4096 3,768,441 6379.4% 2.4GiB ~0% +4.3%
echo-ws 16384 3,586,702 6503.4% 2.5GiB +0.5% +4.2%
echo-ws-pipeline 512 24,603,148 6787.3% 2.3GiB -1.3% ~0%
echo-ws-pipeline 4096 25,021,235 6631.2% 2.4GiB +0.5% ~0%
echo-ws-pipeline 16384 23,550,083 6333.6% 2.6GiB -0.8% +4.0%
echo-ws-limited 512 2,082,245 5481.8% 2.3GiB -0.7% ~0%
echo-ws-limited 4096 2,570,787 6246.0% 2.4GiB +0.5% ~0%
Full log
  Bandwidth:  154.17MB/s
  WS upgrades: 16384
  WS frames:   115118784
  Latency samples: 115118784 / 115118784 responses (100.0%)
[info] CPU 6767.2% | Mem 2.6GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     16384 (256/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   11.45ms   11.10ms   13.20ms   17.30ms   21.70ms

  113793712 frames sent in 5.00s, 113531568 frames received
  Throughput: 22.70M req/s
  Bandwidth:  152.06MB/s
  WS upgrades: 16384
  WS frames:   113531568
  Latency samples: 113531568 / 113531568 responses (100.0%)
[info] CPU 6463.9% | Mem 2.6GiB

=== Best: 23550083 req/s (CPU: 6333.6%, Mem: 2.6GiB) ===
[info] saved results/echo-ws-pipeline/16384/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine

==============================================
=== fulmine / echo-ws-limited / 512c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    149us    120us    261us    561us   2.03ms

  10411181 frames sent in 5.00s, 10411225 frames received
  Throughput: 2.08M req/s
  Bandwidth:  46.85MB/s
  WS upgrades: 1056931
  WS frames:   10411225
  Latency samples: 10411189 / 10411225 responses (100.0%)
  Reconnects: 1041137
[info] CPU 5481.8% | Mem 2.3GiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    143us    118us    257us    527us   1.12ms

  10345404 frames sent in 5.00s, 10345523 frames received
  Throughput: 2.07M req/s
  Bandwidth:  46.56MB/s
  WS upgrades: 1049740
  WS frames:   10345523
  Latency samples: 10345481 / 10345523 responses (100.0%)
  Reconnects: 1034607
[info] CPU 5572.5% | Mem 2.3GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    143us    118us    256us    517us   1.08ms

  10387526 frames sent in 5.00s, 10387625 frames received
  Throughput: 2.08M req/s
  Bandwidth:  46.75MB/s
  WS upgrades: 1054677
  WS frames:   10387625
  Latency samples: 10387581 / 10387625 responses (100.0%)
  Reconnects: 1038808
[info] CPU 5512.3% | Mem 2.4GiB

=== Best: 2082245 req/s (CPU: 5481.8%, Mem: 2.3GiB) ===
[info] saved results/echo-ws-limited/512/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine

==============================================
=== fulmine / echo-ws-limited / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.05ms    866us   1.77ms   3.17ms   5.99ms

  12811584 frames sent in 5.00s, 12809146 frames received
  Throughput: 2.56M req/s
  Bandwidth:  57.69MB/s
  WS upgrades: 1285355
  WS frames:   12809146
  Latency samples: 12809137 / 12809146 responses (100.0%)
  Reconnects: 1279825
[info] CPU 5976.6% | Mem 2.4GiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.06ms    930us   1.79ms   2.95ms   3.94ms

  12856556 frames sent in 5.00s, 12853935 frames received
  Throughput: 2.57M req/s
  Bandwidth:  57.92MB/s
  WS upgrades: 1287779
  WS frames:   12853935
  Latency samples: 12857001 / 12853935 responses (100.0%)
  Reconnects: 1284262
[info] CPU 6246.0% | Mem 2.4GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.07ms    953us   1.80ms   2.96ms   3.89ms

  12845714 frames sent in 5.00s, 12845453 frames received
  Throughput: 2.57M req/s
  Bandwidth:  57.83MB/s
  WS upgrades: 1291236
  WS frames:   12845453
  Latency samples: 12845416 / 12845453 responses (100.0%)
  Reconnects: 1284409
[info] CPU 6060.9% | Mem 2.4GiB

=== Best: 2570787 req/s (CPU: 6246.0%, Mem: 2.4GiB) ===
[info] saved results/echo-ws-limited/4096/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/fulmine.json - 28 new, 28 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

@nigrosimone

Copy link
Copy Markdown
Contributor Author

Thanks for running it. One row in that result is mine and it is a regression, so I have taken the change back.

crud at 4096 connections, against the previous run of this entry:

before after
rps 352,481 210,973
avg latency 11.56ms 19.41ms
p99 21.20ms 43.90ms
cpu 4502% 3236%
memory 8.1GiB 11.2GiB
non-2xx 0 0

The CPU is the interesting column: it went down while latency doubled, and nothing failed, so the
processes were waiting rather than working. That is a bottleneck that moved out of this entry and into
Redis. Server-assisted client-side caching makes Redis keep an invalidation table per key per client
and push a message to all 64 of them whenever one writes, and this test writes on every cache miss.

The last commit puts ioredis back exactly as it was, with the reason written next to it so nobody
tries it again. Two things from those commits are kept because they are independent of the client:
the two crud response-header objects are built once instead of being spread per request, and the body
reader joins its chunks as buffers so a UTF-8 character split across two chunks survives.

Sorry for the wasted run. Whenever you can re-run it, crud should be back around 352k; the rest of
the table was already fine, with pipelined, json, json-tls, api-16 and async-db up 3-5%
from the 5.3.0 bump itself.

@nigrosimone

Copy link
Copy Markdown
Contributor Author

/benchmark -f lightning --save

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

👋 /benchmark request received. A collaborator will review and approve the run.

@nigrosimone nigrosimone changed the title Bump fulmine to 5.3.0 Bump fulmine to 5.4.0 Aug 7, 2026
@nigrosimone

Copy link
Copy Markdown
Contributor Author

Bumped to 5.4.0, which is on npm now, so this PR is one thing to approve rather than two: the
ioredis revert and the new version get measured together.

What is in it that this benchmark can see:

  • crud should return to around 352k. That row is the reason for the revert, and the previous run's
    40% drop is explained in the comment above.
  • Four compatibility fixes, none of which change the shapes this benchmark exercises: a mount no
    longer answers past a layer written before it, res.format's 406 leaves the route as Express's
    does, req.query hands back a fresh object per read as Express's getter does, and
    res.getHeader("content-length") answers instead of coming back empty.
  • Two small ones on the response path: it no longer builds its Writable state until something asks,
    measured at 45ns a response, and the peer-address read no longer reopens its window every 100000
    requests.

Nothing here should move the other rows outside noise. If any of them does, I would rather hear it
than not, since this rig is steadier than mine.

@nigrosimone

Copy link
Copy Markdown
Contributor Author

/benchmark -f lightning --save

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

👋 /benchmark request received. A collaborator will review and approve the run.

@MDA2AV

MDA2AV commented Aug 7, 2026

Copy link
Copy Markdown
Owner

/benchmark -f fulmine --save

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

👋 /benchmark request received. A collaborator will review and approve the run.

@MDA2AV

MDA2AV commented Aug 7, 2026

Copy link
Copy Markdown
Owner

there is no "lightning" framework, I think it somehow translated from italian to english lol

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: fulmine | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,128,115 6762.7% 2.6GiB -8.0% -55.9%
baseline 4096 1,106,235 6588.8% 2.6GiB -8.6% -55.9%
pipelined 512 7,896,176 6579.7% 2.5GiB +7.0% -58.3%
pipelined 4096 7,882,640 6564.7% 2.6GiB +7.5% -60.0%
limited-conn 512 957,714 6215.6% 2.6GiB -7.3% -65.3%
limited-conn 4096 1,017,734 6450.8% 2.7GiB -7.5% -64.5%
json 4096 1,061,146 6655.1% 2.6GiB -4.6% -59.4%
json-comp 512 400,205 6223.2% 8.5GiB -6.2% +10.4%
json-comp 4096 411,258 6400.2% 9.0GiB -4.0% -1.1%
json-comp 16384 423,202 6330.7% 10.5GiB -3.5% +1.0%
json-tls 4096 994,024 6601.1% 2.6GiB -5.0% -60.6%
upload 32 2,040 3058.9% 6.7GiB ~0% -1.5%
upload 256 2,140 6313.2% 7.1GiB +0.1% ~0%
api-4 256 34,674 393.6% 403MiB -3.0% -19.4%
api-16 1024 126,921 1556.1% 1.2GiB +2.7% -36.8%
static 1024 541,909 6513.4% 3.7GiB +1.0% -49.3%
static 4096 585,570 6512.9% 7.4GiB +1.0% ~0%
static 6800 570,414 6500.2% 7.7GiB +2.2% -6.1%
async-db 1024 228,797 5870.9% 4.1GiB +0.8% -40.6%
crud 4096 357,052 4458.0% 8.0GiB +1.3% -1.2%
echo-ws 512 3,713,621 6436.3% 2.3GiB -0.5% ~0%
echo-ws 4096 3,781,001 6545.8% 2.4GiB +0.3% +4.3%
echo-ws 16384 3,587,532 6497.5% 2.5GiB +0.5% +4.2%
echo-ws-pipeline 512 24,733,760 6791.5% 2.3GiB -0.8% ~0%
echo-ws-pipeline 4096 25,011,145 6603.9% 2.4GiB +0.4% ~0%
echo-ws-pipeline 16384 23,840,864 6349.7% 2.6GiB +0.4% +4.0%
echo-ws-limited 512 2,086,949 5568.7% 2.4GiB -0.5% +4.3%
echo-ws-limited 4096 2,567,800 6250.3% 2.4GiB +0.4% ~0%
Full log
  Bandwidth:  155.21MB/s
  WS upgrades: 16384
  WS frames:   115888304
  Latency samples: 115888304 / 115888304 responses (100.0%)
[info] CPU 6768.1% | Mem 2.6GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     16384 (256/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   11.40ms   10.90ms   13.30ms   17.60ms   22.10ms

  114610912 frames sent in 5.00s, 114352864 frames received
  Throughput: 22.86M req/s
  Bandwidth:  153.15MB/s
  WS upgrades: 16384
  WS frames:   114352864
  Latency samples: 114352864 / 114352864 responses (100.0%)
[info] CPU 6499.1% | Mem 2.6GiB

=== Best: 23840864 req/s (CPU: 6349.7%, Mem: 2.6GiB) ===
[info] saved results/echo-ws-pipeline/16384/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine

==============================================
=== fulmine / echo-ws-limited / 512c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    145us    117us    255us    547us   2.21ms

  10283973 frames sent in 5.00s, 10284020 frames received
  Throughput: 2.06M req/s
  Bandwidth:  46.28MB/s
  WS upgrades: 1044043
  WS frames:   10284020
  Latency samples: 10285603 / 10284020 responses (100.0%)
  Reconnects: 1028405
[info] CPU 5464.4% | Mem 2.3GiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    147us    121us    260us    536us   1.35ms

  10434688 frames sent in 5.00s, 10434748 frames received
  Throughput: 2.09M req/s
  Bandwidth:  46.96MB/s
  WS upgrades: 1058358
  WS frames:   10434748
  Latency samples: 10434713 / 10434748 responses (100.0%)
  Reconnects: 1043488
[info] CPU 5568.7% | Mem 2.4GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    145us    120us    259us    528us   1.17ms

  10404195 frames sent in 5.00s, 10404277 frames received
  Throughput: 2.08M req/s
  Bandwidth:  46.82MB/s
  WS upgrades: 1054908
  WS frames:   10404277
  Latency samples: 10404243 / 10404277 responses (100.0%)
  Reconnects: 1040468
[info] CPU 5478.6% | Mem 2.4GiB

=== Best: 2086949 req/s (CPU: 5568.7%, Mem: 2.4GiB) ===
[info] saved results/echo-ws-limited/512/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine

==============================================
=== fulmine / echo-ws-limited / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.07ms    881us   1.78ms   3.21ms   6.12ms

  12802653 frames sent in 5.00s, 12801086 frames received
  Throughput: 2.56M req/s
  Bandwidth:  57.65MB/s
  WS upgrades: 1285123
  WS frames:   12801086
  Latency samples: 12801066 / 12801086 responses (100.0%)
  Reconnects: 1279236
[info] CPU 5970.4% | Mem 2.4GiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.05ms    906us   1.76ms   2.90ms   3.86ms

  12837912 frames sent in 5.00s, 12839000 frames received
  Throughput: 2.57M req/s
  Bandwidth:  57.78MB/s
  WS upgrades: 1287878
  WS frames:   12839000
  Latency samples: 12838928 / 12839000 responses (100.0%)
  Reconnects: 1284380
[info] CPU 6250.3% | Mem 2.4GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.06ms    934us   1.80ms   2.97ms   4.69ms

  12827468 frames sent in 5.00s, 12827893 frames received
  Throughput: 2.56M req/s
  Bandwidth:  57.74MB/s
  WS upgrades: 1292103
  WS frames:   12827893
  Latency samples: 12827845 / 12827893 responses (100.0%)
  Reconnects: 1282824
[info] CPU 6049.3% | Mem 2.4GiB

=== Best: 2567800 req/s (CPU: 6250.3%, Mem: 2.4GiB) ===
[info] saved results/echo-ws-limited/4096/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/fulmine.json - 28 new, 28 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

@nigrosimone

Copy link
Copy Markdown
Contributor Author

Fulmine = Lightning
:D

@nigrosimone nigrosimone changed the title Bump fulmine to 5.4.0 Bump fulmine to 5.4.1 Aug 8, 2026
@nigrosimone

nigrosimone commented Aug 8, 2026

Copy link
Copy Markdown
Contributor Author

Bumped to 5.4.1. The last run's -4..-9% on the query-carrying rows was real, it was mine, and this release removes it.

Expected on re-run: baseline, limited-conn, json, json-tls, json-comp and api-4 back to their 5.3.0 numbers, crud staying at ~357k, everything else unchanged.

@nigrosimone

Copy link
Copy Markdown
Contributor Author

/benchmark -f fulmine --save

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

👋 Benchmark request received. A collaborator will review and approve the run.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

⚠️ /benchmark --save cannot start: main has diverged and cannot be auto-merged into this branch. Please merge or rebase main manually, push, and re-run /benchmark --save.

@nigrosimone

Copy link
Copy Markdown
Contributor Author

Merged upstream/main in, so the branch is mergeable again and /benchmark --save should start. The three commits it picked up (static-tls, the pipelined reference-only change, the new PR commands) touch nothing under frameworks/fulmine, and the entry is unchanged at ^5.4.1.

Same expectation as before: crud around 357k, and the query-carrying rows (baseline, limited-conn, json, json-tls, json-comp, api-4) back to their 5.3.0 numbers now that the copy-per-read is gone.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

👋 Benchmark request received. A collaborator will review and approve the run.

@nigrosimone nigrosimone changed the title Bump fulmine to 5.4.1 Bump fulmine to 5.5.0 Aug 8, 2026
@nigrosimone

Copy link
Copy Markdown
Contributor Author

Bumped again, to 5.5.0, which is on npm. Nothing in it changes what this benchmark exercises: it adds res.flushHeaders() and fixes two TypeScript declarations, all three found by running an Angular SSR application on it. The performance-relevant change is still the one from 5.4.1, the req.query fix.

Expectation for the run is unchanged: crud around 357k, and baseline, limited-conn, json, json-tls, json-comp and api-4 back to their 5.3.0 numbers.

The branch is mergeable with main as of the merge two commits back.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: fulmine | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,230,527 6816.6% 2.6GiB +0.4% -55.9%
baseline 4096 1,212,009 6776.3% 2.6GiB +0.1% -55.9%
pipelined 512 7,896,553 6584.6% 2.5GiB +7.0% -58.3%
pipelined 4096 7,864,864 6569.7% 2.6GiB +7.2% -60.0%
limited-conn 512 1,032,024 6147.7% 2.6GiB -0.1% -65.3%
limited-conn 4096 1,102,548 6412.2% 2.7GiB +0.2% -64.5%
json 4096 1,141,097 6649.7% 2.6GiB +2.6% -59.4%
json-comp 512 412,239 6227.9% 8.7GiB -3.4% +13.0%
json-comp 4096 425,219 6419.6% 9.2GiB -0.8% +1.1%
json-comp 16384 438,127 6312.7% 10.6GiB ~0% +1.9%
json-tls 4096 1,076,647 6586.0% 2.6GiB +2.9% -60.6%
upload 32 2,024 2997.7% 6.6GiB -0.8% -2.9%
upload 256 2,129 6107.8% 7.1GiB -0.4% ~0%
api-4 256 35,639 393.3% 425MiB -0.3% -15.0%
api-16 1024 129,658 1542.9% 1.2GiB +4.9% -36.8%
static 1024 543,570 6509.7% 3.9GiB +1.3% -46.6%
static 4096 588,146 6545.6% 7.3GiB +1.4% -1.4%
static 6800 567,798 6487.7% 7.6GiB +1.7% -7.3%
async-db 1024 224,285 5942.1% 3.6GiB -1.2% -47.8%
crud 4096 357,460 4430.6% 8.0GiB +1.4% -1.2%
echo-ws 512 3,726,934 6467.6% 2.3GiB -0.1% ~0%
echo-ws 4096 3,768,590 6547.5% 2.4GiB ~0% +4.3%
echo-ws 16384 3,577,210 6232.0% 2.5GiB +0.2% +4.2%
echo-ws-pipeline 512 24,949,417 6817.8% 2.3GiB ~0% ~0%
echo-ws-pipeline 4096 24,928,886 6589.2% 2.4GiB +0.1% ~0%
echo-ws-pipeline 16384 23,866,108 6339.2% 2.6GiB +0.5% +4.0%
echo-ws-limited 512 2,089,072 5617.6% 2.3GiB -0.3% ~0%
echo-ws-limited 4096 2,564,958 6043.9% 2.4GiB +0.3% ~0%
Full log
  Bandwidth:  155.22MB/s
  WS upgrades: 16384
  WS frames:   115897872
  Latency samples: 115897872 / 115897872 responses (100.0%)
[info] CPU 6774.7% | Mem 2.6GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     16384 (256/thread)
  Pipeline:  16
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   11.37ms   10.90ms   13.30ms   17.30ms   22.00ms

  114962448 frames sent in 5.00s, 114700304 frames received
  Throughput: 22.93M req/s
  Bandwidth:  153.62MB/s
  WS upgrades: 16384
  WS frames:   114700304
  Latency samples: 114700304 / 114700304 responses (100.0%)
[info] CPU 6491.1% | Mem 2.6GiB

=== Best: 23866108 req/s (CPU: 6339.2%, Mem: 2.6GiB) ===
[info] saved results/echo-ws-pipeline/16384/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine

==============================================
=== fulmine / echo-ws-limited / 512c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    148us    120us    260us    547us   1.89ms

  10387264 frames sent in 5.00s, 10387343 frames received
  Throughput: 2.08M req/s
  Bandwidth:  46.75MB/s
  WS upgrades: 1053414
  WS frames:   10387343
  Latency samples: 10387286 / 10387343 responses (100.0%)
  Reconnects: 1038759
[info] CPU 5493.9% | Mem 2.3GiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    147us    120us    259us    531us   1.52ms

  10445283 frames sent in 5.00s, 10445364 frames received
  Throughput: 2.09M req/s
  Bandwidth:  47.01MB/s
  WS upgrades: 1057189
  WS frames:   10445364
  Latency samples: 10445329 / 10445364 responses (100.0%)
  Reconnects: 1044563
[info] CPU 5617.6% | Mem 2.3GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency    144us    119us    256us    526us   1.37ms

  10368939 frames sent in 5.00s, 10369015 frames received
  Throughput: 2.07M req/s
  Bandwidth:  46.66MB/s
  WS upgrades: 1052581
  WS frames:   10369015
  Latency samples: 10368981 / 10369015 responses (100.0%)
  Reconnects: 1036941
[info] CPU 5493.0% | Mem 2.4GiB

=== Best: 2089072 req/s (CPU: 5617.6%, Mem: 2.3GiB) ===
[info] saved results/echo-ws-limited/512/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine

==============================================
=== fulmine / echo-ws-limited / 4096c (tool=gcannon) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.06ms    884us   1.76ms   3.13ms   6.13ms

  12786832 frames sent in 5.00s, 12786917 frames received
  Throughput: 2.56M req/s
  Bandwidth:  57.54MB/s
  WS upgrades: 1284015
  WS frames:   12786917
  Latency samples: 12786888 / 12786917 responses (100.0%)
  Reconnects: 1278009
[info] CPU 6001.3% | Mem 2.4GiB

[run 2/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.05ms    947us   1.72ms   2.82ms   3.73ms

  12814731 frames sent in 5.00s, 12814431 frames received
  Throughput: 2.56M req/s
  Bandwidth:  57.70MB/s
  WS upgrades: 1286396
  WS frames:   12814431
  Latency samples: 12814402 / 12814431 responses (100.0%)
  Reconnects: 1281611
[info] CPU 6236.5% | Mem 2.4GiB

[run 3/3]
gcannon v0.5.3 [WS]
  Target:    localhost:8080/ws
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  10
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.06ms    929us   1.78ms   2.85ms   3.78ms

  12826266 frames sent in 5.00s, 12824793 frames received
  Throughput: 2.56M req/s
  Bandwidth:  57.75MB/s
  WS upgrades: 1287619
  WS frames:   12824793
  Latency samples: 12824791 / 12824793 responses (100.0%)
  Reconnects: 1281697
[info] CPU 6043.9% | Mem 2.4GiB

=== Best: 2564958 req/s (CPU: 6043.9%, Mem: 2.4GiB) ===
[info] saved results/echo-ws-limited/4096/fulmine.json
httparena-bench-fulmine
httparena-bench-fulmine
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/fulmine.json - 28 new, 28 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

@nigrosimone

Copy link
Copy Markdown
Contributor Author

It's good for me! 🎉

@MDA2AV
MDA2AV merged commit 8e85bf7 into MDA2AV:main Aug 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants