Skip to content

ci: Use CodSpeed-hosted runners for perf CI - #4001

Open
larseggert wants to merge 4 commits into
mainfrom
codspeed-macro-runners
Open

larseggert wants to merge 4 commits into
mainfrom
codspeed-macro-runners

Conversation

@larseggert

@larseggert larseggert commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

We now have access to their amd-ryzen-9950x-x86_64 models.

@codecov

codecov Bot commented Sep 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.85%. Comparing base (fb2eb16) to head (51ac172).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #4001      +/-   ##
==========================================
+ Coverage   96.84%   96.85%   +0.01%     
==========================================
  Files         118      118              
  Lines       39989    39989              
  Branches    39989    39989              
==========================================
+ Hits        38728    38732       +4     
+ Misses       1237     1233       -4     
  Partials       24       24              
Flag Coverage Δ
freebsd 94.28% <100.00%> (+<0.01%) ⬆️
linux 97.07% <100.00%> (+<0.01%) ⬆️
macos 95.15% <100.00%> (+<0.01%) ⬆️
windows 95.25% <100.00%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
neqo-common 99.26% <ø> (ø)
neqo-http3 95.33% <100.00%> (ø)
neqo-qpack 96.97% <ø> (ø)
neqo-transport 97.83% <100.00%> (+0.01%) ⬆️
neqo-udp 95.37% <ø> (ø)
mtu 89.13% <ø> (ø)
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@codspeed

codspeed Bot commented Sep 16, 2026

Copy link
Copy Markdown

Merging this PR will regress 11 benchmarks

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 6 improved benchmarks
❌ 11 regressed benchmarks
✅ 64 untouched benchmarks
🆕 6 new benchmarks
🗄️ 7 archived benchmarks run1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory simulated/pacing-true/same-seed 2.1 MB 2.3 MB -10.41%
Memory simulated/pacing-true/varying-seeds 2.1 MB 2.3 MB -10.41%
Simulation coalesce_acked_from_zero 1000 ranges 599.4 µs 655.3 µs -8.53%
Simulation coalesce_acked_from_zero 10 ranges 9.6 µs 10.3 µs -7%
Simulation inbound_frame in-order 1.2 ms 1.3 ms -6.18%
Simulation inbound_frame 5%-dup 1.2 ms 1.3 ms -6.16%
Simulation coalesce_acked_from_zero 3 ranges 3.5 µs 3.7 µs -6%
Simulation mark_sent retransmit 33.1 µs 34.9 µs -5.19%
Simulation coalesce_acked_from_zero 1 ranges 2.7 µs 2.8 µs -4.05%
Simulation write_frames 5-fair-streams all-active 23.7 µs 24.5 µs -3.34%
Simulation inbound_frame 2%-loss 2.3 ms 2.4 ms -3.17%
Simulation simulated/pacing-true/varying-seeds 116.1 ms 74.8 ms +55.25%
Simulation simulated/pacing-false/varying-seeds 115.1 ms 74.4 ms +54.7%
Simulation simulated/pacing-false/same-seed 116.5 ms 75.5 ms +54.31%
Simulation simulated/pacing-true/same-seed 115.8 ms 75.1 ms +54.21%
Memory simulated/pacing-false/same-seed 2.1 MB 1.4 MB +43.51%
Memory simulated/pacing-false/varying-seeds 2.1 MB 1.4 MB +43.51%
🆕 WallTime walltime/1-streams/each-4194304-bytes N/A 10.7 ms N/A
🆕 WallTime walltime/10-streams/each-1048576-bytes N/A 28.6 ms N/A
🆕 WallTime 1-conn/1-100mb-req (aka. Upload)/mtu-1500 N/A 48.7 ms N/A
... ... ... ... ... ...

ℹ️ Only the first 20 benchmarks are displayed. Go to the app to view all benchmarks.

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing codspeed-macro-runners (51ac172) with main (fb2eb16)

Open in CodSpeed

Footnotes

  1. 7 benchmarks were run, but are now archived. If they were deleted in another branch, consider rebasing to remove them from the report. Instead if they were added back, click here to restore them.

@larseggert

Copy link
Copy Markdown
Collaborator Author

The new CodSpeed runners aren't faster and don't have tighter variances than our own.

@larseggert larseggert closed this Sep 17, 2026
@larseggert

Copy link
Copy Markdown
Collaborator Author

But there are more of them than our three. Let's give this another go.

@larseggert larseggert reopened this Sep 18, 2026
@larseggert
larseggert force-pushed the codspeed-macro-runners branch from 4f0cec6 to 6368d59 Compare September 18, 2026 06:28
@larseggert larseggert changed the title ci: Run all CodSpeed benchmarks and client/server perfcompare on the … ci: Use CodSpeed-hosted runners for perf CI Sep 18, 2026
@larseggert
larseggert force-pushed the codspeed-macro-runners branch 4 times, most recently from 77b9f58 to 035b765 Compare September 18, 2026 10:53
Comment thread .github/workflows/perfcompare.yml Fixed
Comment thread .github/workflows/perfcompare.yml Fixed
Comment thread .github/workflows/perfcompare.yml Fixed
@larseggert
larseggert force-pushed the codspeed-macro-runners branch from 035b765 to f050c3f Compare September 18, 2026 11:50
Comment thread neqo-http3/src/connection.rs Fixed
Comment thread neqo-http3/src/connection_client.rs Fixed
Comment thread neqo-http3/src/connection_server.rs Fixed
Comment thread neqo-http3/src/connection_server.rs Fixed
@larseggert
larseggert force-pushed the codspeed-macro-runners branch 2 times, most recently from aa64d8c to 56699b3 Compare September 18, 2026 12:48
@larseggert
larseggert force-pushed the codspeed-macro-runners branch 3 times, most recently from bc62963 to f12d70d Compare September 18, 2026 13:28
@larseggert
larseggert requested a balanced review from Copilot September 18, 2026 13:37

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Broad performance-methodology changes and unresolved CodSpeed setup inconsistencies require human validation.

Pull request overview

Migrates performance CI from self-hosted runners to CodSpeed-hosted hardware.

Changes:

  • Reworks benchmark workflows, matrices, artifact handling, and profiling.
  • Adds CodSpeed performance-comparison infrastructure and CPU pinning.
  • Removes obsolete self-hosted runner provisioning.
File summaries
File Description
test/ansible/shrink.yml Removes runner cleanup playbook.
test/ansible/README.md Removes self-hosted runner documentation.
test/ansible/inventory.ini Removes retired runner inventory.
test/ansible/install.yml Removes runner provisioning playbook.
test/ansible/etc/sudoers.d.bench Removes benchmark sudo rules.
test/ansible/etc/perfconfig Removes runner perf configuration.
test/ansible/etc/journald.conf.d/99-neqo.conf Removes runner journal limits.
test/ansible/etc/apt.conf.d/99-disable-periodic Removes runner apt configuration.
test/ansible/bin/unprep.sh Removes CPU restoration script.
test/ansible/bin/prep.sh Removes CPU preparation script.
test-fixture/src/sim/connection.rs Disables interface MTU discovery in simulations.
test-fixture/Cargo.toml Reduces benchmark logging and NSS features.
neqo-udp/Cargo.toml Reduces benchmark logging.
neqo-transport/src/lib.rs Lowers crypto failure log level.
neqo-transport/Cargo.toml Adjusts benchmark features and logging.
neqo-transport/benches/min_bandwidth.rs Prints benchmark result despite log filtering.
neqo-qpack/Cargo.toml Reduces benchmark logging.
neqo-http3/src/connection.rs Lowers active-stream closure log level.
neqo-http3/Cargo.toml Reduces benchmark logging.
neqo-common/Cargo.toml Reduces benchmark logging.
neqo-bin/Cargo.toml Reduces benchmark logging.
AGENTS.md Documents the revised performance workflows.
.github/workflows/perfcompare.yml Moves comparisons to CodSpeed runners.
.github/workflows/codspeed.yml Uses CodSpeed macro runners and isolated Rust homes.
.github/workflows/codspeed-perfcompare.yml Adds CodSpeed transfer benchmarks.
.github/workflows/bench.yml Parallelizes benchmarks and aggregates results.
.github/scripts/perfcompare.py Replaces cpusets with CPU affinity.
.github/scripts/format-bench-results.py Removes obsolete cset filtering.
.github/dependabot.yml Annotates the disabled update configuration.
.github/actions/process-perf/action.yml Generalizes profile and report processing.
.github/actions/cpu-tuning/action.yml Removes obsolete machine tuning action.
.github/actions/bench-matrix/action.yml Includes all benchmark modes.
.github/actions/bench-machine/action.yml Adds CodSpeed runner preparation.
.github/actionlint.yml Registers the new runner label.
Review details
  • Files reviewed: 32/34 changed files
  • Comments generated: 3
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread .github/workflows/bench.yml
Comment thread .github/workflows/perfcompare.yml
Comment thread .github/workflows/codspeed-perfcompare.yml
@larseggert
larseggert force-pushed the codspeed-macro-runners branch 2 times, most recently from 61140de to 3c2f01b Compare September 18, 2026 14:06
Pin benchmarks with taskset inside the CPU set the runner reserves, and set
only the loopback MTU; the runners apply the rest of the tuning themselves and
refuse elevated niceness. perf keeps sudo, which its tracepoints require, so
only the profiling passes are privileged.

Cap logging in the bench feature at warn, skip the interface MTU lookup for the
simulator's unroutable peer address, and demote two per-packet warnings, to
keep benchmark logs small.

Share the perf post-processing between both workflows, build the peer
implementations from one matrix job, and fetch their artifacts in one step.

Drop test/ansible along with the on-prem runner it provisioned, and install
SciPy for perfcompare.py in the workflow instead.
@larseggert
larseggert force-pushed the codspeed-macro-runners branch from 3c2f01b to 60b8b7b Compare September 18, 2026 14:27
@larseggert
larseggert marked this pull request as ready for review September 18, 2026 14:27

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice cleanup — trading ~280 lines of cpu-tuning plus the whole test/ansible/ tree for a runner image that already does the tuning is a big maintenance win, and the ephemeral-runner-per-job model removes a whole class of "stale state from the previous run" workarounds (clean: false, rm -rf target/criterion, fuser -k 4433, the restore step). The perfcompare.py refactor into Unit/run_unit/merge is clean, and deferring the SciPy import so --list-units/--merge work without it is a nice touch.

A few PR-wide observations, none of them blocking:

Fan-out cost. perfcompare.yml now runs 13 units and bench.yml one job per criterion variant, each paying a checkout, a toolchain install, install-samply, inferno, and an artifact download on a paid macro runner before doing any measuring. That per-job overhead is likely comparable to the measurement itself for the cheaper benches. Coarser units — one job per bench binary, or per client/server pair with the cc/pacing sweep inside — would keep most of the wall-clock win at a fraction of the billed minutes. Worth a look at the first full run's timings before settling.

Result-comparability break. MTU 1504 → 1500, new hardware, pmtud_iface_mtu(false) in the sim, and (see inline) renamed neqo-bin benchmarks all land at once, so no number in this PR is comparable to anything recorded before it, and the CodSpeed baselines for the affected benches reset. That's fine and probably unavoidable, but please call it out in the commit message so a future bisect doesn't chase the step change.

Duplication between the two results jobs. bench.yml and perfcompare.yml now end with near-identical jobs: checkout + git fetch of BASE_REF, download-artifact by pattern, format markdown, baseline-sha.txt, event.json, two upload-artifact exports, pr-comment-data-export, and "Fail on regression" grepping results.txt. That's ~60 duplicated lines that will drift; a reusable workflow taking the artifact pattern and the formatting command would collapse it.

Responses to existing review comments.

  • Agreeing with Copilot's two comments about the missing job-local RUSTUP_HOME/CARGO_HOME (bench.yml, perfcompare.yml): both jobs run install-build-deps on the same runner image whose preinstalled toolchain motivated the workaround in codspeed.yml:54-61, so the same three lines belong there — or, better, move them into install-build-deps itself so no future macro-runner job has to remember.
  • Copilot's codspeed-perfcompare MTU comment is resolved by the MTU: 1500 env plus the mtu: input on testdata-setup.
  • The zizmor ./neqo/... findings are resolved by the $/... conversion.

Minor: AGENTS.md gained the new perf workflows but not quic-build-cache.yml, and format-bench-results.py:236's "The runner keeps its workspace, so drop an earlier run's table" is now stale.

mkdir -p profiles/neqo profiles/neqo-baseline stats/neqo stats/neqo-baseline
: > failed-benchmarks.txt

for benchmark in benchmarks/benchmark-*; do

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Glob expansion is lexicographic, so with ≥10 benchmarks the order is benchmark-0, benchmark-1, benchmark-10, benchmark-11, …, benchmark-2. format-bench-results.py emits all-bench-results.md in input order (process_input), so the "All results" list in the PR comment comes out shuffled.

Suggested change
for benchmark in benchmarks/benchmark-*; do
for benchmark in $(printf '%s\n' benchmarks/benchmark-* | sort -V); do


let achieved_bandwidth = TRANSFER_AMOUNT as f64 * 8.0 / simulated_time.as_secs_f64();
qinfo!(
println!(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

qinfo! went to stderr, but bench_exec … | tee -a ../results.txt captures stdout, so this line now lands in results.txt. format-bench-results.py treats every column-0 line as a new benchmark name, so each of the two invocations adds an empty <details> entry to the PR comment. eprintln! keeps it where qinfo! used to put it (the job log) without the survivorship in results.txt.

Suggested change
println!(
eprintln!(

Comment thread neqo-transport/Cargo.toml

[features]
bench = ["neqo-common/bench", "nss/bench", "blapi", "test-fixture/bench", "log/release_max_level_info"]
bench = ["neqo-common/bench", "blapi", "test-fixture/bench", "log/release_max_level_warn"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Capping at warn is what forces the two qwarn!qdebug! demotions in library code (neqo-transport/src/lib.rs:243, neqo-http3/src/connection.rs:781). Those are real diagnostics — a failed crypto operation and close(0) with live streams — and downgrading them for benchmark noise costs signal in every consumer, Gecko included. release_max_level_error compiles the qwarn!s out of bench builds entirely and lets both call sites stay at qwarn!:

Suggested change
bench = ["neqo-common/bench", "blapi", "test-fixture/bench", "log/release_max_level_warn"]
bench = ["neqo-common/bench", "blapi", "test-fixture/bench", "log/release_max_level_error"]

log's STATIC_MAX_LEVEL picks the first matching feature in off → error → warn → … order, so this only behaves predictably if every bench feature list in the workspace uses the same level.

Note

Why is nss/bench dropped here and in test-fixture/Cargo.toml? If it only set nss's own release_max_level_*, it was already a no-op (neqo's stricter cap wins), but that's worth a word in the commit message since nothing else documents it.

run: cargo codspeed build --package "$CRATE" --locked --features bench --bench "$BENCH" --measurement-mode "$MODE"

- name: Set the loopback MTU # Same packetization as the other benchmark workflows.
run: sudo ip link set dev lo mtu "$MTU"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

MTU is declared at workflow level, so it is also exported to the benchmark process, and neqo-bin/benches/main.rs:36 appends /mtu-$MTU to the bench name only when it is set. Every neqo-bin benchmark therefore gets renamed in CodSpeed and starts from an empty history. If only the interface needs the MTU, scope the variable to this step so the names are unchanged:

Suggested change
run: sudo ip link set dev lo mtu "$MTU"
- name: Set the loopback MTU # Same packetization as the other benchmark workflows.
env:
MTU: 1500
run: sudo ip link set dev lo mtu "$MTU"

(and drop the workflow-level MTU). If the rename is intended, it'd be good to say so in the commit message — the CodSpeed baselines for those benches are lost either way.

config: ${{ github.workspace }}/codspeed.yml
token: ${{ secrets.CODSPEED_TOKEN }} # zizmor: ignore[secrets-outside-env]

- name: Stop server

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

Nothing checks that the server outlived the 500 rounds. The non-neqo client commands from perfcompare-commands are bash -c "… >/dev/null 2>&1", so if the server dies mid-run every remaining round fails instantly and silently — walltime mode would record a large, meaningless improvement rather than an error. A one-liner before the teardown makes that loud:

Suggested change
- name: Stop server
- name: Verify the server survived the benchmark
run: kill -0 "$SERVER_PID"
- name: Stop server

Comment on lines +41 to +44
perf script -i "$f" | inferno-collapse-perf --event-filter cycles | inferno-flamegraph --colors rust > "${f%.perf}.svg"
# Per-symbol IPC: divide the `instructions` section by `cycles:u`, both self cost.
perf report -i "$f" --stdio --no-children -g none \
-F overhead,period,symbol,dso > "${f%.perf}.report.txt"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Unlike the samply import above, these two aren't folded into fail. The step runs under bash -e -o pipefail, so one bad recording aborts the loop: the remaining files are never converted and the [ -z "$fail" ] accounting never runs. Same treatment as the line above keeps it best-effort but still fails the step:

Suggested change
perf script -i "$f" | inferno-collapse-perf --event-filter cycles | inferno-flamegraph --colors rust > "${f%.perf}.svg"
# Per-symbol IPC: divide the `instructions` section by `cycles:u`, both self cost.
perf report -i "$f" --stdio --no-children -g none \
-F overhead,period,symbol,dso > "${f%.perf}.report.txt"
perf script -i "$f" | inferno-collapse-perf --event-filter cycles | inferno-flamegraph --colors rust > "${f%.perf}.svg" ||
{ echo "::error::flamegraph failed for $f"; fail=1; }
# Per-symbol IPC: divide the `instructions` section by `cycles:u`, both self cost.
perf report -i "$f" --stdio --no-children -g none \
-F overhead,period,symbol,dso > "${f%.perf}.report.txt" ||
{ echo "::error::perf report failed for $f"; fail=1; }

[ -z "$MTU" ] || sudo ip link set dev lo mtu "$MTU"

# `libc6-dbg` lets samply symbolicate libc frames.
[ "$APT_UPDATED" ] || sudo apt-get update && echo "APT_UPDATED=1" >> "$GITHUB_ENV"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

A || B && C parses as (A || B) && C, so C also runs when A succeeds — harmless here (a duplicate GITHUB_ENV line), but it reads as if-then-else and isn't. An explicit form also makes the perfcompare.yml copy of this idiom easier to keep in sync:

Suggested change
[ "$APT_UPDATED" ] || sudo apt-get update && echo "APT_UPDATED=1" >> "$GITHUB_ENV"
if [ -z "$APT_UPDATED" ]; then
sudo apt-get update
echo "APT_UPDATED=1" >> "$GITHUB_ENV"
fi

grep -qw "$(hostname)" /etc/hosts ||
echo "127.0.0.1 $(hostname)" | sudo tee -a /etc/hosts > /dev/null

[ -z "$MTU" ] || sudo ip link set dev lo mtu "$MTU"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tip

With cpu-tuning gone, every measurement now rests on undocumented properties of the runner image (the ones the description lists). If CodSpeed changes it, results degrade with no signal at all — and samply silently loses kernel symbols if kptr_restrict isn't 0. A few exact-match assertions are cheap insurance:

Suggested change
[ -z "$MTU" ] || sudo ip link set dev lo mtu "$MTU"
[ -z "$MTU" ] || sudo ip link set dev lo mtu "$MTU"
# The runner image is expected to have relaxed these; warn if it stops doing so.
for WANT in /proc/sys/kernel/perf_event_paranoid=-1 /proc/sys/kernel/kptr_restrict=0; do
IS=$(cat "${WANT%=*}")
[ "$IS" = "${WANT#*=}" ] || echo "::warning::${WANT%=*} is $IS, expected ${WANT#*=}"
done

(smt/control is worth reporting too, but its value varies — off/forceoff/notsupported — so it needs a pattern rather than equality.)


- name: Merge unit results
run: |
python3 neqo/.github/scripts/perfcompare.py --merge units --size "$SIZE" --runs "$RUNS"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

merge() globs whatever steps.md files exist, so a unit that failed just drops its row: the table posted to the PR silently under-reports, with the only hint being the red matrix job. bench.yml handles this explicitly with the benchmark-status/failed sentinel and the "Fail on benchmark errors" step — worth mirroring here, or at least having merge() compare the gathered units against units() and emit a ::warning:: (or a :x: row) for the missing ones.

@github-actions

Copy link
Copy Markdown
Contributor

Performance profiles for profiler.firefox.com

Benchmarks (14)
  • neqo-bin-main: pr · base
  • neqo-common-decoder: pr · base
  • neqo-http3-streams_simulated: pr · base
  • neqo-http3-streams_walltime: pr · base
  • neqo-transport-frame_decode: pr · base
  • neqo-transport-min_bandwidth: pr · base
  • neqo-transport-pacer: pr · base
  • neqo-transport-packet_codec: pr · base
  • neqo-transport-range_tracker: pr · base
  • neqo-transport-rx_stream_orderer: pr · base
  • neqo-transport-send_streams: pr · base
  • neqo-transport-sent_packets: pr · base
  • neqo-transport-transfer_simulated: pr · base
  • neqo-transport-transfer_walltime: pr · base
Comparisons (5)

@github-actions

Copy link
Copy Markdown
Contributor

Client/server transfer results

Performance differences relative to fb2eb16.

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server Mean±σ Min–Max Median±MAD MiB/s±σ ΔMedian
google-neqo-cubic 68.1 ± 0.4 67.0 – 69.0 68.1 ± 0.5 469.8 ± 2.9 💔 +0.8 (+1.2%)
neqo-neqo-cubic-nopacing ⚠️ 19.7 ± 0.5 19.1 – 21.1 19.5 ± 0.1 1627.5 ± 41.3 💚 -0.2 (-1.2%)
neqo-neqo-newreno 19.9 ± 0.4 19.4 – 21.6 19.8 ± 0.2 1607.1 ± 33.7 💚 -0.4 (-2.0%)
neqo-neqo-newreno-nopacing 19.5 ± 0.4 19.0 – 20.9 19.4 ± 0.2 1640.7 ± 33.7 💚 -0.3 (-1.3%)

Table above only shows statistically significant changes. See all results below.

All results

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server Mean±σ Min–Max Median±MAD MiB/s±σ ΔMedian
google-google 132.0 ± 0.6 130.5 – 134.1 132.0 ± 0.6 242.5 ± 1.2
google-neqo-cubic 68.1 ± 0.4 67.0 – 69.0 68.1 ± 0.5 469.8 ± 2.9 💔 +0.8 (+1.2%)
neqo-google-cubic 234.8 ± 45.7 168.3 – 498.6 226.7 ± 36.2 136.3 ± 26.5 +3.9 (+1.8%)
neqo-neqo-cubic ⚠️ 19.7 ± 0.4 19.3 – 21.3 19.6 ± 0.2 1623.7 ± 30.6 -0.2 (-1.0%)
neqo-neqo-cubic-nopacing ⚠️ 19.7 ± 0.5 19.1 – 21.1 19.5 ± 0.1 1627.5 ± 41.3 💚 -0.2 (-1.2%)
neqo-neqo-newreno 19.9 ± 0.4 19.4 – 21.6 19.8 ± 0.2 1607.1 ± 33.7 💚 -0.4 (-2.0%)
neqo-neqo-newreno-nopacing 19.5 ± 0.4 19.0 – 20.9 19.4 ± 0.2 1640.7 ± 33.7 💚 -0.3 (-1.3%)
neqo-quiche-cubic 33.4 ± 0.2 32.8 – 34.0 33.4 ± 0.2 958.5 ± 6.1 +0.0 (+0.1%)
neqo-s2n-cubic 37.5 ± 0.2 37.1 – 37.9 37.5 ± 0.2 854.0 ± 3.5 -0.0 (-0.0%)
quiche-neqo-cubic ⚠️ 37.6 ± 2.7 36.0 – 64.0 37.2 ± 0.5 852.0 ± 61.8 -0.3 (-0.8%)
quiche-quiche 38.6 ± 0.2 38.2 – 39.2 38.5 ± 0.2 829.9 ± 3.8
s2n-neqo-cubic 112.1 ± 0.4 111.3 – 113.3 112.0 ± 0.4 285.5 ± 1.0 +0.1 (+0.1%)
s2n-s2n ⚠️ 164.1 ± 24.1 134.8 – 259.0 158.9 ± 1.1 195.0 ± 28.7

Download data for profiler.firefox.com or download performance comparison data.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark results

No significant performance differences relative to fb2eb16.

All results
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1500
       time:   [49.983 ms 50.029 ms 50.076 ms]
       thrpt:  [1.9502 GiB/s 1.9520 GiB/s 1.9538 GiB/s]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1500
       time:   [67.187 ms 67.469 ms 67.757 ms]
       thrpt:  [147.59 Kelem/s 148.22 Kelem/s 148.84 Kelem/s]
transfer/walltime/pacing-true/varying-seeds
       time:   [2.0672 ms 2.0693 ms 2.0719 ms]
       thrpt:  [1.8853 GiB/s 1.8877 GiB/s 1.8897 GiB/s]
transfer/walltime/pacing-false/same-seed
       time:   [2.0563 ms 2.0574 ms 2.0586 ms]
       thrpt:  [1.8975 GiB/s 1.8987 GiB/s 1.8997 GiB/s]
transfer/walltime/pacing-true/same-seed
       time:   [2.0581 ms 2.0590 ms 2.0600 ms]
       thrpt:  [1.8962 GiB/s 1.8972 GiB/s 1.8979 GiB/s]
Found 7 outliers among 100 measurements (7.00%)
7 (7.00%) high mild
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1500
       time:   [2.9219 ms 2.9229 ms 2.9239 ms]
       thrpt:  [342.01   B/s 342.13   B/s 342.25   B/s]
Found 4 outliers among 100 measurements (4.00%)
4 (4.00%) high mild
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1500
       time:   [49.979 ms 50.015 ms 50.051 ms]
       thrpt:  [1.9511 GiB/s 1.9525 GiB/s 1.9539 GiB/s]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
streams/walltime/1-streams/each-1000-bytes
       time:   [133.71 µs 134.30 µs 135.04 µs]
       thrpt:  [7.0621 MiB/s 7.1012 MiB/s 7.1323 MiB/s]
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
streams/walltime/1000-streams/each-1-bytes
       time:   [3.9028 ms 3.9126 ms 3.9216 ms]
       thrpt:  [249.02 KiB/s 249.60 KiB/s 250.22 KiB/s]
Found 20 outliers among 100 measurements (20.00%)
15 (15.00%) low severe
5 (5.00%) low mild
streams/walltime/1000-streams/each-1000-bytes
       time:   [11.254 ms 11.261 ms 11.268 ms]
       thrpt:  [84.636 MiB/s 84.691 MiB/s 84.744 MiB/s]
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
streams-flow-controlled/walltime/1-streams/each-4194304-bytes
       time:   [10.557 ms 10.562 ms 10.569 ms]
       thrpt:  [378.47 MiB/s 378.70 MiB/s 378.90 MiB/s]
Found 5 outliers among 100 measurements (5.00%)
1 (1.00%) low mild
1 (1.00%) high mild
3 (3.00%) high severe
streams-flow-controlled/walltime/10-streams/each-1048576-bytes
       time:   [27.512 ms 27.529 ms 27.548 ms]
       thrpt:  [363.00 MiB/s 363.26 MiB/s 363.47 MiB/s]
Found 5 outliers among 100 measurements (5.00%)
2 (2.00%) high mild
3 (3.00%) high severe
transfer/walltime/pacing-false/varying-seeds
       time:   [2.0631 ms 2.0641 ms 2.0652 ms]
       thrpt:  [1.8915 GiB/s 1.8925 GiB/s 1.8934 GiB/s]

Download data for profiler.firefox.com or download performance comparison data.

@github-actions

Copy link
Copy Markdown
Contributor

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to main at fb2eb16.

neqo-pr as clientneqo-pr as server
neqo-pr vs. go-x-net: BP BA
neqo-pr vs. haproxy: 🚀M BP BA
neqo-pr vs. lsquic: L1 C1
neqo-pr vs. msquic: Z A L1 C1
neqo-pr vs. mvfst: A BA
neqo-pr vs. neqo: Z A
neqo-pr vs. nginx: BP BA
neqo-pr vs. ngtcp2: Z ⚠️L1 C1 ⚠️BA CM
neqo-pr vs. picoquic: Z A 🚀BA
neqo-pr vs. quic-go: A
neqo-pr vs. quiche: BP BA
neqo-pr vs. s2n-quic: CM
neqo-pr vs. tquic: S BP BA
neqo-pr vs. xquic: S R Z A L1 C1
aioquic vs. neqo-pr: CM
go-x-net vs. neqo-pr: CM
kwik vs. neqo-pr: BP BA CM
linuxquic vs. neqo-pr: run cancelled after 20 min
msquic vs. neqo-pr: CM
mvfst vs. neqo-pr: Z L1 C1 CM
neqo vs. neqo-pr: Z A
openssl vs. neqo-pr: LR M A CM
quic-go vs. neqo-pr: CM
quiche vs. neqo-pr: CM
quinn vs. neqo-pr: 🚀C1 V2 CM
s2n-quic vs. neqo-pr: CM
tquic vs. neqo-pr: CM
xquic vs. neqo-pr: M CM
All results

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

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