Skip to content

fiber, fiber-tuned, fiber-websocket, go-fasthttp: Fiber 3.6.0 and fasthttp 1.75.0 - #1555

Open
ReneWerner87 wants to merge 3 commits into
MDA2AV:mainfrom
ReneWerner87:fiber-3.6.0
Open

ReneWerner87 wants to merge 3 commits into
MDA2AV:mainfrom
ReneWerner87:fiber-3.6.0

Conversation

@ReneWerner87

Copy link
Copy Markdown
Contributor

Description

Dependency bump for the three Fiber entries and for go-fasthttp.

entry change
fiber, fiber-tuned, fiber-websocket Fiber v3.5.0 -> v3.6.0
fiber, fiber-websocket fasthttp v1.73.0 -> v1.75.0, the version Fiber 3.6.0 requires
fiber-tuned fasthttp master pin (c96f600) -> v1.75.0
go-fasthttp fasthttp v1.69.0 -> v1.75.0

Go 1.26. Fiber 3.6.0 declares go 1.26.0, so fiber and fiber-tuned move their go
directive up from 1.25.0. The Dockerfiles already build on golang:1.26-alpine and are
unchanged.

fiber-tuned loses its fourth difference. It pinned fasthttp master for the switch
from andybalholm/brotli to go-brrr. fasthttp v1.75.0 carries that switch and Fiber 3.6.0
requires v1.75.0, so the standard entry now gets go-brrr through the release and the pin is
gone. Both READMEs, the header comment in fiber-tuned/main.go and its meta.json
description now name three tuned things instead of four. The measurement tables in
fiber-tuned/README.md stay and are labelled as taken on Fiber 3.5.0; they were not
repeated.

Compress is mounted on /json only. Fiber 3.6.0's compress middleware honours q-values,
so it now acts on the br;q=1, gzip;q=0.8 the static profiles send, which 3.5.0 passed to a
matcher that compares whole tokens. Left on /static, it would encode per request whatever
has no twin on disk and a compressible type: the two woff2 fonts, which are compressed already
(bold.woff2, 22,528 bytes, comes out as 22,518 at level 4 and as 22,532 at level 0). So
fiber and fiber-tuned take /static out of the mount, and staticFile sets
Vary: Accept-Encoding itself on every answer, which the middleware did before. Under the
profiles' header every one of the 20 files answers as it does on main, headers included.

go-fasthttp. The fasthttp bump only, no code change. The entry compresses with
compress/gzip itself, so the brotli library switch does not reach it. erikdubbelboer is
added to maintainers.

Checks. gofmt, go vet, go mod verify and go mod tidy -diff are clean for all
four entries and the Docker images build. The images from main and from this branch ran
side by side and were compared on status, headers and decoded body: 206 requests each for
fiber and fiber-tuned (JSON, gzip and brotli, TLS, async-db, crud, traversal paths, and
all 20 static files over HTTP and TLS under four Accept-Encoding variants), 37 for
go-fasthttp. What differs:

  • the brotli json-comp body of fiber, 1490 -> 1489 bytes, which is go-brrr at level 4
  • /json requested with q-values is now brotli-encoded, which is the 3.6.0 negotiation
  • the two woff2 fonts requested with a bare gzip or br token are no longer encoded by
    the middleware and go out as they are on disk

scripts/validate-ws.py passes 7/7 against fiber-websocket. scripts/validate.sh was not
run locally (macOS, no host networking), and no benchmark results are included.


PR Commands - comment on this PR to trigger (requires collaborator approval):

Command Description
/benchmark -f <framework> Run every test the framework subscribes to
/benchmark -f <framework> -t <test> Run one test only
/benchmark -f <framework> --save Run and save results (updates the leaderboard on merge)
/benchmark -f <framework> -t <test> --save Run one test and save results
/benchmark -f <framework> --compare <other> Measure the deltas against another framework instead of this one
/benchmark-multiple -f <fw1>,<fw2>,... Benchmark several frameworks in one run - takes -t and --save too; saved results land in a single commit
/benchmark-multiple --save No -f needed: benchmark and save every framework the PR touches
/benchmark-test -t <test> Benchmark all enabled frameworks subscribed to <test> and save the results

For /benchmark, always specify -f <framework>; the flags combine in any order. Results come back as a comment with a per-profile table of RPS, p99, CPU and memory - one table per framework on multi runs. A new benchmark comment while a run is in flight queues behind it (one deep) instead of cancelling it. For multi-framework PRs (dependency bumps, same-language refactors) prefer /benchmark-multiple, which runs everything in a single job and commits all saved results together, so no run overwrites another. --compare works on single-framework runs only.

What the deltas are measured against. By default, this framework's own results published on main - answering "did this change help?". When you are tuning a variant or a successor entry, --compare re-bases them on another entry instead:

/benchmark -f genhttp --compare genhttp-kestrel

The reply states which baseline it used, and profiles the other framework does not run show n/a rather than a delta.


Run benchmarks locally

You can validate and benchmark your framework locally with the lite script - no CPU pinning, fixed connection counts, all load generators run in Docker.

./scripts/validate.sh <framework>
./scripts/benchmark-lite.sh <framework> baseline
./scripts/benchmark-lite.sh --load-threads 4 <framework>

Requirements: Docker Engine on Linux. Load generators (gcannon, h2load, h2load-h3, wrk) are built as self-contained Docker images on first run.

Fiber 3.6.0 requires Go 1.26 and fasthttp v1.75.0. That release ships the
go-brrr brotli fiber-tuned pinned fasthttp master for, so the pin is gone
and the docs name three tuned things instead of four.

The 3.6.0 compress middleware honours q-values, so on /static it would now
brotli the two woff2 fonts on every request under the static profiles'
"br;q=1, gzip;q=0.8". Compress is mounted on /json only and staticFile
sets Vary itself.
@github-actions

Copy link
Copy Markdown
Contributor

👋 Heads up! This PR modifies the following frameworks:

@MDA2AV

MDA2AV commented Oct 13, 2026

Copy link
Copy Markdown
Owner

/benchmark-multiple --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

Frameworks: 4 | Test: all tests

✅ fiber

Test Conn RPS Rate CPU/req p99 p99.9 CPU Mem Δ RPS Δ Mem
baseline 4096 2,623,678 — — — — 6367.5% 348MiB +2.1% +3.9%
pipelined 4096 18,543,424 — — — — 6689.5% 357MiB +7.8% +5.6%
limited-conn 4096 2,062,489 — — — — 6444.1% 892MiB +0.6% +15.8%
json-comp 4096 290,414 — — — — 6238.2% 804MiB +63.1% +6.1%
json-comp 16384 288,805 — — — — 6558.8% 1.6GiB +61.0% +6.7%
json-tls 4096 902,093 — — — — 6311.6% 722MiB +6.4% +10.6%
8gbit 512 49,441 0.9888 67.23us 137.0us 3389.0us 351.8% 406MiB +0.5% +36.2%
static-tls 1024 579,542 — — — — 6489.9% 529MiB +4.0% +2.9%
async-db 1024 240,295 — — — — 5403.0% 605MiB +0.8% +5.4%
latency-1m 1024 997,737 0.9977 38.31us 246.0us 2469.0us 4332.5% 278MiB ~0% +2.6%
latency-10k 1024 9,983 0.9983 43.56us 106.0us 229.0us 41.8% 275MiB ~0% +5.8%
latency-500k-8cpu 1024 377,273 0.7545 ⚠️ 21.14us 6785024.0us 8515584.0us 789.0% 61MiB +0.8% -11.6%
async 32000 1,519,042 — — — — 4208.2% 1.0GiB ~0% +2.9%

✅ fiber-tuned

Test Conn RPS Rate CPU/req p99 p99.9 CPU Mem Δ RPS Δ Mem
baseline 4096 2,539,295 — — — — 6645.1% 911MiB +1.7% +0.3%
pipelined 4096 18,511,670 — — — — 6529.6% 906MiB +9.5% +1.2%
limited-conn 4096 2,036,184 — — — — 6218.3% 1.2GiB +1.6% +20.0%
json-comp 4096 650,735 — — — — 6322.8% 1.1GiB -1.3% +10.0%
json-comp 16384 636,030 — — — — 6274.7% 1.9GiB -0.9% +18.7%
json-tls 4096 1,135,135 — — — — 6270.8% 1.0GiB +7.8% +6.4%
8gbit 512 49,435 0.9887 66.97us 142.0us 3641.0us 349.5% 865MiB +0.2% +3.0%
static-tls 1024 573,390 — — — — 6496.8% 842MiB +4.9% +2.2%
async-db 1024 240,544 — — — — 4408.4% 929MiB -0.7% +2.3%
latency-1m 1024 998,244 0.9982 37.65us 241.0us 1366.0us 4285.5% 884MiB ~0% +1.8%
latency-10k 1024 9,982 0.9982 43.15us 103.0us 176.0us 41.1% 873MiB ~0% +0.2%
latency-500k-8cpu 1024 376,681 0.7534 ⚠️ 21.17us 6301696.0us 7800832.0us 791.2% 108MiB +2.0% -7.7%
async 32000 1,520,864 — — — — 4197.7% 1.3GiB +0.2% +8.3%

✅ fiber-websocket

Test Conn RPS CPU Mem Δ RPS Δ Mem
echo-ws 512 3,011,629 6431.5% 338MiB -5.4% +0.3%
echo-ws 4096 3,006,069 6379.6% 449MiB -6.2% -0.4%
echo-ws 16384 2,649,499 6629.0% 990MiB -4.8% +15.4%
echo-ws-pipeline 512 4,621,699 6274.6% 418MiB -2.6% +10.9%
echo-ws-pipeline 4096 4,638,201 6071.3% 572MiB -2.2% +25.7%
echo-ws-pipeline 16384 4,627,739 6270.7% 1.0GiB -2.2% ~0%
echo-ws-limited 512 1,655,701 5898.9% 490MiB -2.3% +2.9%
echo-ws-limited 4096 1,910,325 6220.7% 633MiB -4.6% +3.8%

✅ go-fasthttp

Test Conn RPS Rate CPU/req p99 p99.9 CPU Mem Δ RPS Δ Mem
baseline 4096 1,187,086 — — — — 4003.4% 154MiB -0.7% -2.5%
pipelined 4096 17,058,051 — — — — 6733.1% 146MiB +14.9% -5.2%
limited-conn 4096 694,242 — — — — 4626.5% 307MiB -1.8% -0.6%
json-comp 4096 34,340 — — — — 3075.1% 3.2GiB -0.5% ~0%
json-comp 16384 27,453 — — — — 4043.6% 5.5GiB +1.4% -15.4%
json-tls 4096 509,505 — — — — 4923.6% 445MiB -3.6% +4.5%
8gbit 512 49,322 0.9864 66.54us 155.0us 7662.0us 351.4% 112MiB ~0% +13.1%
static-tls 1024 290,357 — — — — 4356.0% 347MiB +1.5% +5.8%
async-db 1024 60,466 — — — — 3781.3% 210MiB +5.5% +2.9%
latency-1m 1024 998,359 0.9984 33.25us 1129.0us 6618.0us 3630.6% 88MiB ~0% +4.8%
latency-10k 1024 9,982 0.9982 32.39us 105.0us 2049.0us 30.8% 75MiB ~0% -15.7%
latency-500k-8cpu 1024 380,114 0.7602 ⚠️ 20.98us 4704256.0us 4798464.0us 788.6% 45MiB NEW NEW
async 32000 932,469 — — — — 3915.3% 794MiB NEW NEW

This branch has not been deployed

No deployments
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.

3 participants