Skip to content

Bump fulmine to 5.5.2 - #1098

Merged
MDA2AV merged 5 commits into
MDA2AV:mainfrom
nigrosimone:bump-fulmine-552
Aug 11, 2026
Merged

Bump fulmine to 5.5.2#1098
MDA2AV merged 5 commits into
MDA2AV:mainfrom
nigrosimone:bump-fulmine-552

Conversation

@nigrosimone

@nigrosimone nigrosimone commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Pin bump for the fulmine entry, from ^5.5.0 to ^5.5.2 (changelog), plus three changes to the entry.

In the release, measured here against the previous revision:

  • a use with no path ran a regex on every hop for a mount prefix that was always 0. Removing it is -16.8% CPU per request on a chain of 100 middlewares, 23.1k to 27.6k req/s
  • the ETag hashed a copy of the body instead of the body: -7.7% on a 35 byte body, -41% on 54 KB
  • the generic handler drops a promise pair nobody awaited, and a response no longer allocates its chunk queue or its flush closure unless it streams

In the entry:

  • /static is served on the TLS listener as well, so it subscribes to static-tls, same handler as the plaintext one.
  • a stock Caddy edge in proxy/, so it subscribes to gateway-64 and gateway-h3. Caddy terminates TLS and serves /static/* from disk, the server keeps the three dynamic endpoints it already had, reached over loopback h1. I ran both stacks locally against the repo certs: h2 and h3 both negotiate, /static comes from the proxy with the right content types and a 404 for a missing file, and /baseline2, /json/N and /async-db all answer through it.
  • json-comp prefers brotli, which it never reached before because Accept-Encoding: gzip, br matched gzip first. On these payloads q3 is 12% smaller than gzip level 1 for about 24us more per request, and with the score squaring the body size that should come out ahead, but it is a model and not your rig, so the run decides.

/benchmark -f fulmine --save

@nigrosimone
nigrosimone marked this pull request as ready for review August 11, 2026 05:09
@nigrosimone

Copy link
Copy Markdown
Contributor Author

benchmark -f fulmine --save

@nigrosimone
nigrosimone marked this pull request as draft August 11, 2026 05:19
@nigrosimone
nigrosimone marked this pull request as ready for review August 11, 2026 05:20
@MDA2AV

MDA2AV commented Aug 11, 2026

Copy link
Copy Markdown
Owner

/benchmark -f fulmine --save

@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: fulmine | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,335,278 6794.8% 2.6GiB +8.5% ~0%
baseline 4096 1,297,447 6797.5% 2.6GiB +7.0% ~0%
pipelined 512 7,917,830 6580.3% 2.5GiB +0.3% ~0%
pipelined 4096 7,868,038 6575.8% 2.6GiB ~0% ~0%
limited-conn 512 1,096,830 6156.2% 2.6GiB +6.3% ~0%
limited-conn 4096 1,175,660 6459.1% 2.7GiB +6.6% ~0%
json 4096 1,141,084 6444.0% 2.6GiB ~0% ~0%
json-comp 512 341,669 6164.5% 8.0GiB -17.1% -8.0%
json-comp 4096 356,319 6407.9% 9.0GiB -16.2% -2.2%
json-comp 16384 374,554 6309.4% 10.3GiB -14.5% -2.8%
json-tls 4096 1,076,676 6585.5% 2.6GiB ~0% ~0%
upload 32 2,037 3081.7% 6.6GiB +0.6% ~0%
upload 256 2,161 6256.9% 7.5GiB +1.5% +5.6%
api-4 256 36,387 394.5% 402MiB +2.1% -5.4%
api-16 1024 131,175 1540.6% 1.3GiB +1.2% +8.3%
static 1024 540,509 6505.3% 3.9GiB -0.6% ~0%
static 4096 582,701 6498.8% 7.5GiB -0.9% +2.7%
static 6800 567,379 6558.9% 7.6GiB ~0% ~0%
static-tls 1024 432,837 6513.3% 3.7GiB NEW NEW
static-tls 4096 463,875 6457.0% 7.2GiB NEW NEW
static-tls 6800 452,587 6380.7% 7.6GiB NEW NEW
async-db 1024 224,608 5944.0% 3.6GiB +0.1% ~0%
crud 4096 355,740 4401.2% 8.1GiB -0.5% +1.2%
gateway-64 512 88,935 4318.6% 4.5GiB NEW NEW
gateway-64 1024 82,340 4268.4% 6.7GiB NEW NEW
gateway-h3 64 91,075 3590.5% 2.6GiB NEW NEW
gateway-h3 256 62,791 2626.4% 3.7GiB NEW NEW
echo-ws 512 3,705,673 6522.3% 2.3GiB -0.6% ~0%
echo-ws 4096 3,785,984 6549.7% 2.4GiB +0.5% ~0%
echo-ws 16384 3,565,343 6209.8% 2.5GiB -0.3% ~0%
echo-ws-pipeline 512 24,580,339 6740.0% 2.3GiB -1.5% ~0%
echo-ws-pipeline 4096 24,778,835 6573.8% 2.4GiB -0.6% ~0%
echo-ws-pipeline 16384 23,533,654 6309.9% 2.6GiB -1.4% ~0%
echo-ws-limited 512 2,083,680 5585.6% 2.4GiB -0.3% +4.3%
echo-ws-limited 4096 2,557,031 6232.9% 2.4GiB -0.3% ~0%
Full log
  Bandwidth:  153.65MB/s
  WS upgrades: 16384
  WS frames:   114720176
  Latency samples: 114720176 / 114720176 responses (100.0%)
[info] CPU 6771.9% | 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.38ms   10.90ms   13.30ms   17.30ms   21.30ms

  114385824 frames sent in 5.00s, 114127776 frames received
  Throughput: 22.82M req/s
  Bandwidth:  152.85MB/s
  WS upgrades: 16384
  WS frames:   114127776
  Latency samples: 114127776 / 114127776 responses (100.0%)
[info] CPU 6489.4% | Mem 2.6GiB

=== Best: 23533654 req/s (CPU: 6309.9%, 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    118us    256us    526us   1.53ms

  10311760 frames sent in 5.00s, 10311870 frames received
  Throughput: 2.06M req/s
  Bandwidth:  46.42MB/s
  WS upgrades: 1045666
  WS frames:   10311870
  Latency samples: 10311820 / 10311870 responses (100.0%)
  Reconnects: 1031237
[info] CPU 5485.4% | Mem 2.4GiB

[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    146us    120us    259us    532us   1.53ms

  10418325 frames sent in 5.00s, 10418400 frames received
  Throughput: 2.08M req/s
  Bandwidth:  46.89MB/s
  WS upgrades: 1057438
  WS frames:   10418400
  Latency samples: 10420195 / 10418400 responses (100.0%)
  Reconnects: 1041876
[info] CPU 5585.6% | 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    146us    120us    257us    530us   1.44ms

  10370492 frames sent in 5.00s, 10370575 frames received
  Throughput: 2.07M req/s
  Bandwidth:  46.67MB/s
  WS upgrades: 1051450
  WS frames:   10370575
  Latency samples: 10370544 / 10370575 responses (100.0%)
  Reconnects: 1037105
[info] CPU 5485.7% | Mem 2.4GiB

=== Best: 2083680 req/s (CPU: 5585.6%, 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.06ms    867us   1.75ms   3.22ms   6.13ms

  12763348 frames sent in 5.00s, 12762161 frames received
  Throughput: 2.55M req/s
  Bandwidth:  57.47MB/s
  WS upgrades: 1281777
  WS frames:   12762161
  Latency samples: 12762133 / 12762161 responses (100.0%)
  Reconnects: 1275611
[info] CPU 5961.9% | 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.07ms    964us   1.78ms   2.87ms   3.92ms

  12785656 frames sent in 5.00s, 12785156 frames received
  Throughput: 2.56M req/s
  Bandwidth:  57.56MB/s
  WS upgrades: 1281829
  WS frames:   12785156
  Latency samples: 12785039 / 12785156 responses (100.0%)
  Reconnects: 1278194
[info] CPU 6232.9% | 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    940us   1.76ms   2.91ms   4.48ms

  12767481 frames sent in 5.00s, 12767728 frames received
  Throughput: 2.55M req/s
  Bandwidth:  57.47MB/s
  WS upgrades: 1282544
  WS frames:   12767728
  Latency samples: 12767661 / 12767728 responses (100.0%)
  Reconnects: 1276853
[info] CPU 6053.6% | Mem 2.4GiB

=== Best: 2557031 req/s (CPU: 6232.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 - 35 new, 35 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

The json-comp row reads -16% on RPS, which is the brotli change and is expected rather than a regression: that profile scores rps * (minBpr/myBpr)^2, so the bytes count twice over.

Bytes per response went 1562 to 1374, so the size term is 1.29 against 0.84 on rps. Against the field's current minBpr of 1107 the profile score goes 16.6 to 18.6.

Still well short of the 1107 the leader ships, so there is more left there, but brotli above q3 gets very slow on payloads this small and stopped paying for itself.

@MDA2AV
MDA2AV merged commit 658ada5 into MDA2AV:main Aug 11, 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