Skip to content

feat(qlog): add CC/performance events#3440

Merged
larseggert merged 3 commits into
mozilla:mainfrom
larseggert:feat-qlog-perf-data
Mar 12, 2026
Merged

feat(qlog): add CC/performance events#3440
larseggert merged 3 commits into
mozilla:mainfrom
larseggert:feat-qlog-perf-data

Conversation

@larseggert
Copy link
Copy Markdown
Collaborator

  • Add recovery_parameters_set, connection_closed, packets_acked, and mtu_updated events
  • Populate old state in connection_state_updated; add trigger and details to packet_dropped; set owner in connection_tparams_set

Copilot AI review requested due to automatic review settings March 11, 2026 14:32
@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 11, 2026

Codecov Report

❌ Patch coverage is 95.23810% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 94.00%. Comparing base (b7cdcb9) to head (a48f5d2).
⚠️ Report is 7 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3440      +/-   ##
==========================================
- Coverage   94.27%   94.00%   -0.28%     
==========================================
  Files         125      129       +4     
  Lines       38177    38671     +494     
  Branches    38177    38671     +494     
==========================================
+ Hits        35991    36351     +360     
- Misses       1348     1471     +123     
- Partials      838      849      +11     
Flag Coverage Δ
freebsd 93.05% <94.17%> (-0.26%) ⬇️
linux 94.10% <95.23%> (-0.18%) ⬇️
macos 93.98% <95.23%> (-0.18%) ⬇️
windows 94.08% <94.70%> (-0.18%) ⬇️

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

Components Coverage Δ
neqo-common 98.54% <100.00%> (+0.04%) ⬆️
neqo-crypto 86.90% <ø> (ø)
neqo-http3 93.91% <ø> (ø)
neqo-qpack 94.34% <ø> (-0.47%) ⬇️
neqo-transport 94.93% <95.21%> (-0.29%) ⬇️
neqo-udp 82.97% <ø> (+0.07%) ⬆️
mtu 86.61% <ø> (ø)

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds additional qlog instrumentation for congestion control and performance-related lifecycle events in neqo-transport, and wires qlog through PMTUD so MTU changes can be logged.

Changes:

  • Extend qlog event generation with recovery_parameters_set, connection_closed, packets_acked, and mtu_updated, plus richer connection_state_updated / packet_dropped data.
  • Emit the new events from Connection state transitions and ACK processing.
  • Propagate Qlog into PMTUD and related components; export CC constants needed for qlog output.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
neqo-transport/src/qlog.rs Adds new qlog event helpers and conversions (state/close/ACK/MTU/recovery params) and enriches existing events.
neqo-transport/src/pmtud.rs Stores a Qlog handle and emits mtu_updated when PLPMTU changes.
neqo-transport/src/path.rs Keeps a Qlog on Path while still passing it into the sender (clone + store).
neqo-transport/src/connection/mod.rs Emits recovery parameters at start, logs packets acked, logs old/new connection state, and emits connection closed events.
neqo-transport/src/cc/mod.rs Exposes CC constants used by qlog recovery parameter reporting.
neqo-transport/src/cc/classic_cc.rs Passes qlog into PMTUD so MTU updates are logged under the same trace.
neqo-common/src/qlog.rs Changes default streamer importance from Base to Extra.

Comment thread neqo-transport/src/qlog.rs Outdated
Comment thread neqo-transport/src/qlog.rs
- Add `recovery_parameters_set`, `connection_closed`, `packets_acked`,
  and `mtu_updated` events
- Populate `old` state in `connection_state_updated`; add `trigger` and
  `details` to `packet_dropped`; set `owner` in `connection_tparams_set`
@larseggert larseggert force-pushed the feat-qlog-perf-data branch from d398081 to 0c55b1c Compare March 11, 2026 14:49
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Mar 11, 2026

Merging this PR will degrade performance by 7.87%

⚡ 6 improved benchmarks
❌ 6 regressed benchmarks
✅ 39 untouched benchmarks

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
WallTime neqo-google 1.6 s 1.7 s -3.61%
WallTime neqo-s2n 613.4 ms 519 ms +18.17%
WallTime 1-conn/1-100mb-req (aka. Upload) 562.9 ms 543.9 ms +3.49%
WallTime quiche-neqo 331 ms 345.1 ms -4.08%
WallTime neqo-neqo-cubic 271.2 ms 292.5 ms -7.25%
WallTime neqo-neqo-newreno-nopacing 269.6 ms 292.6 ms -7.87%
WallTime neqo-neqo-cubic-nopacing 269.2 ms 286.4 ms -5.98%
WallTime neqo-neqo-newreno 275.7 ms 298.2 ms -7.53%
WallTime walltime/pacing-true/same-seed 96 ms 55.8 ms +72.04%
WallTime walltime/pacing-false/varying-seeds 94.8 ms 55.4 ms +71.25%
WallTime walltime/pacing-true/varying-seeds 96.3 ms 55.8 ms +72.62%
WallTime walltime/pacing-false/same-seed 91.7 ms 55.2 ms +66.35%

Comparing larseggert:feat-qlog-perf-data (a48f5d2) with main (47380e8)

Open in CodSpeed

Comment thread neqo-transport/src/pmtud.rs Outdated
@larseggert larseggert enabled auto-merge March 12, 2026 14:53
@github-actions
Copy link
Copy Markdown
Contributor

Failed Interop Tests

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

neqo-pr as clientneqo-pr as server
neqo-pr vs. go-x-net: BP BA
neqo-pr vs. haproxy: BP BA
neqo-pr vs. kwik: BP BA
neqo-pr vs. lsquic: baseline result missing
neqo-pr vs. msquic: A L1 C1 🚀C2
neqo-pr vs. mvfst: A L1 🚀C1 BA
neqo-pr vs. neqo: Z A
neqo-pr vs. nginx: BP BA
neqo-pr vs. ngtcp2: 🚀C1 CM
neqo-pr vs. picoquic: A 🚀BA
neqo-pr vs. quic-go: A
neqo-pr vs. quiche: BP BA
neqo-pr vs. s2n-quic: BA CM
neqo-pr vs. tquic: S BP BA
neqo-pr vs. xquic: A ⚠️L1 C1 ⚠️BP
aioquic vs. neqo-pr: Z CM
go-x-net vs. neqo-pr: CM
kwik vs. neqo-pr: Z BP BA CM
lsquic vs. neqo-pr: Z ⚠️C1
msquic vs. neqo-pr: Z CM
mvfst vs. neqo-pr: Z A L1 C1 CM
neqo vs. neqo-pr: Z A
openssl vs. neqo-pr: LR M A CM
picoquic vs. neqo-pr: Z CM
quic-go vs. neqo-pr: ⚠️L1 BA CM
quiche vs. neqo-pr: Z ⚠️C1 CM
quinn vs. neqo-pr: Z V2 CM
s2n-quic vs. neqo-pr: CM
tquic vs. neqo-pr: Z 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

@larseggert larseggert added this pull request to the merge queue Mar 12, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Client/server transfer results

Performance differences relative to dbbf86a.

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

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google-neqo-cubic 276.1 ± 4.4 268.4 287.0 115.9 ± 7.3 💚 -1.6 -0.6%
neqo-neqo-cubic-nopacing 94.2 ± 3.6 87.6 102.6 339.8 ± 8.9 💚 -1.3 -1.4%
neqo-neqo-newreno 95.9 ± 4.0 88.8 105.1 333.8 ± 8.0 💚 -2.2 -2.2%
s2n-neqo-cubic 172.7 ± 5.1 163.8 188.9 185.3 ± 6.3 💚 -1.8 -1.0%

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 (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google-google-nopacing 464.9 ± 4.3 458.2 477.9 68.8 ± 7.4
google-neqo-cubic 276.1 ± 4.4 268.4 287.0 115.9 ± 7.3 💚 -1.6 -0.6%
msquic-msquic-nopacing 223.4 ± 100.5 143.2 644.2 143.2 ± 0.3
msquic-neqo-cubic 226.7 ± 112.2 144.8 879.7 141.2 ± 0.3 -3.9 -1.7%
neqo-google-cubic 771.3 ± 3.3 765.3 785.6 41.5 ± 9.7 -0.0 -0.0%
neqo-msquic-cubic 159.6 ± 4.3 153.8 167.5 200.5 ± 7.4 -0.4 -0.3%
neqo-neqo-cubic 97.6 ± 5.3 86.8 124.0 327.7 ± 6.0 0.6 0.6%
neqo-neqo-cubic-nopacing 94.2 ± 3.6 87.6 102.6 339.8 ± 8.9 💚 -1.3 -1.4%
neqo-neqo-newreno 95.9 ± 4.0 88.8 105.1 333.8 ± 8.0 💚 -2.2 -2.2%
neqo-neqo-newreno-nopacing 97.1 ± 4.2 87.1 103.8 329.5 ± 7.6 0.2 0.2%
neqo-quiche-cubic 193.2 ± 4.7 186.6 205.0 165.7 ± 6.8 0.2 0.1%
neqo-s2n-cubic 219.1 ± 4.3 209.3 227.6 146.0 ± 7.4 0.9 0.4%
quiche-neqo-cubic 179.7 ± 4.4 167.7 189.1 178.1 ± 7.3 -1.4 -0.8%
quiche-quiche-nopacing 144.5 ± 4.4 136.1 158.5 221.5 ± 7.3
s2n-neqo-cubic 172.7 ± 5.1 163.8 188.9 185.3 ± 6.3 💚 -1.8 -1.0%
s2n-s2n-nopacing 245.8 ± 20.9 230.4 350.7 130.2 ± 1.5

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

Merged via the queue into mozilla:main with commit 70a0ba6 Mar 12, 2026
195 of 196 checks passed
@larseggert larseggert deleted the feat-qlog-perf-data branch March 12, 2026 16:24
@github-actions
Copy link
Copy Markdown
Contributor

Benchmark results

Significant performance differences relative to dbbf86a.

transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1504: 💔 Performance has regressed by +1.6963%.
       time:   [203.56 ms 203.95 ms 204.41 ms]
       thrpt:  [489.22 MiB/s 490.32 MiB/s 491.25 MiB/s]
change:
       time:   [+1.3204% +1.6963% +2.0731] (p = 0.00 < 0.05)
       thrpt:  [-2.0310% -1.6680% -1.3032]
       Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
streams/walltime/1000-streams/each-1000-bytes: 💔 Performance has regressed by +1.5690%.
       time:   [44.653 ms 44.706 ms 44.762 ms]
       change: [+1.4046% +1.5690% +1.7390] (p = 0.00 < 0.05)
       Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) low mild
1 (1.00%) high mild
1 (1.00%) high severe
All results
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1504: 💔 Performance has regressed by +1.6963%.
       time:   [203.56 ms 203.95 ms 204.41 ms]
       thrpt:  [489.22 MiB/s 490.32 MiB/s 491.25 MiB/s]
change:
       time:   [+1.3204% +1.6963% +2.0731] (p = 0.00 < 0.05)
       thrpt:  [-2.0310% -1.6680% -1.3032]
       Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1504: No change in performance detected.
       time:   [284.08 ms 286.13 ms 288.25 ms]
       thrpt:  [34.692 Kelem/s 34.949 Kelem/s 35.201 Kelem/s]
change:
       time:   [-1.2470% -0.1939% +0.8868] (p = 0.72 > 0.05)
       thrpt:  [-0.8790% +0.1943% +1.2628]
       No change in performance detected.
Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) high mild
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1504: No change in performance detected.
       time:   [38.513 ms 38.638 ms 38.782 ms]
       thrpt:  [25.785   B/s 25.881   B/s 25.965   B/s]
change:
       time:   [-0.6598% -0.1645% +0.3239] (p = 0.52 > 0.05)
       thrpt:  [-0.3229% +0.1648% +0.6642]
       No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
2 (2.00%) high mild
3 (3.00%) high severe
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1504: Change within noise threshold.
       time:   [206.18 ms 206.78 ms 207.57 ms]
       thrpt:  [481.76 MiB/s 483.61 MiB/s 485.01 MiB/s]
change:
       time:   [+0.4259% +0.9284% +1.4118] (p = 0.00 < 0.05)
       thrpt:  [-1.3921% -0.9199% -0.4241]
       Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
decode 4096 bytes, mask ff: No change in performance detected.
       time:   [5.5723 µs 5.5833 µs 5.5966 µs]
       change: [-0.1507% +0.0933% +0.3463] (p = 0.48 > 0.05)
       No change in performance detected.
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) high mild
2 (2.00%) high severe
decode 1048576 bytes, mask ff: Change within noise threshold.
       time:   [1.4282 ms 1.4307 ms 1.4332 ms]
       change: [+0.0368% +0.2727% +0.5068] (p = 0.02 < 0.05)
       Change within noise threshold.
decode 4096 bytes, mask 7f: No change in performance detected.
       time:   [8.4504 µs 8.5005 µs 8.5927 µs]
       change: [-0.0714% +0.4408% +1.1065] (p = 0.19 > 0.05)
       No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
2 (2.00%) high mild
5 (5.00%) high severe
decode 1048576 bytes, mask 7f: No change in performance detected.
       time:   [2.1758 ms 2.1790 ms 2.1824 ms]
       change: [-0.2573% -0.0547% +0.1417] (p = 0.60 > 0.05)
       No change in performance detected.
decode 4096 bytes, mask 3f: No change in performance detected.
       time:   [6.9096 µs 6.9183 µs 6.9268 µs]
       change: [-0.2549% -0.0234% +0.2067] (p = 0.85 > 0.05)
       No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
4 (4.00%) high mild
1 (1.00%) high severe
decode 1048576 bytes, mask 3f: No change in performance detected.
       time:   [1.7642 ms 1.7666 ms 1.7692 ms]
       change: [-0.2599% -0.0534% +0.1469] (p = 0.60 > 0.05)
       No change in performance detected.
streams/simulated/1-streams/each-1000-bytes: Change within noise threshold.
       time:   [129.68 ms 129.68 ms 129.69 ms]
       thrpt:  [7.5302 KiB/s 7.5304 KiB/s 7.5306 KiB/s]
change:
       time:   [+0.0020% +0.0057% +0.0092] (p = 0.00 < 0.05)
       thrpt:  [-0.0092% -0.0057% -0.0020]
       Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) high mild
streams/simulated/1000-streams/each-1-bytes: No change in performance detected.
       time:   [2.5362 s 2.5365 s 2.5367 s]
       thrpt:  [394.21   B/s 394.25   B/s 394.30   B/s]
change:
       time:   [-0.0167% -0.0003% +0.0149] (p = 0.97 > 0.05)
       thrpt:  [-0.0149% +0.0003% +0.0167]
       No change in performance detected.
streams/simulated/1000-streams/each-1000-bytes: No change in performance detected.
       time:   [6.5898 s 6.6002 s 6.6120 s]
       thrpt:  [147.70 KiB/s 147.96 KiB/s 148.19 KiB/s]
change:
       time:   [-0.1347% +0.0941% +0.3258] (p = 0.42 > 0.05)
       thrpt:  [-0.3247% -0.0940% +0.1349]
       No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
8 (8.00%) high severe
streams/walltime/1-streams/each-1000-bytes: Change within noise threshold.
       time:   [580.56 µs 582.46 µs 584.67 µs]
       change: [-1.5455% -0.9760% -0.4504] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 10 outliers among 100 measurements (10.00%)
3 (3.00%) high mild
7 (7.00%) high severe
streams/walltime/1000-streams/each-1-bytes: No change in performance detected.
       time:   [12.324 ms 12.343 ms 12.363 ms]
       change: [-0.1976% +0.1077% +0.3916] (p = 0.49 > 0.05)
       No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
streams/walltime/1000-streams/each-1000-bytes: 💔 Performance has regressed by +1.5690%.
       time:   [44.653 ms 44.706 ms 44.762 ms]
       change: [+1.4046% +1.5690% +1.7390] (p = 0.00 < 0.05)
       Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) low mild
1 (1.00%) high mild
1 (1.00%) high severe
coalesce_acked_from_zero 1+1 entries: Change within noise threshold.
       time:   [92.124 ns 92.401 ns 92.685 ns]
       change: [-1.3997% -0.7841% -0.2429] (p = 0.01 < 0.05)
       Change within noise threshold.
Found 12 outliers among 100 measurements (12.00%)
10 (10.00%) high mild
2 (2.00%) high severe
coalesce_acked_from_zero 3+1 entries: No change in performance detected.
       time:   [110.53 ns 110.85 ns 111.19 ns]
       change: [-0.5135% -0.0968% +0.3089] (p = 0.65 > 0.05)
       No change in performance detected.
Found 16 outliers among 100 measurements (16.00%)
2 (2.00%) low mild
4 (4.00%) high mild
10 (10.00%) high severe
coalesce_acked_from_zero 10+1 entries: No change in performance detected.
       time:   [109.94 ns 110.32 ns 110.78 ns]
       change: [-0.7320% -0.1545% +0.3766] (p = 0.61 > 0.05)
       No change in performance detected.
Found 16 outliers among 100 measurements (16.00%)
6 (6.00%) low severe
3 (3.00%) low mild
1 (1.00%) high mild
6 (6.00%) high severe
coalesce_acked_from_zero 1000+1 entries: No change in performance detected.
       time:   [94.383 ns 94.536 ns 94.710 ns]
       change: [-0.2976% +0.1632% +0.6691] (p = 0.51 > 0.05)
       No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
5 (5.00%) high mild
4 (4.00%) high severe
RxStreamOrderer::inbound_frame(): Change within noise threshold.
       time:   [108.38 ms 108.52 ms 108.68 ms]
       change: [+0.5365% +0.8284% +1.0700] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high severe
sent::Packets::take_ranges: No change in performance detected.
       time:   [4.5070 µs 4.6055 µs 4.6935 µs]
       change: [-3.4490% -0.1935% +3.2240] (p = 0.91 > 0.05)
       No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
transfer/simulated/pacing-false/varying-seeds: No change in performance detected.
       time:   [23.941 s 23.941 s 23.941 s]
       thrpt:  [171.09 KiB/s 171.09 KiB/s 171.09 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/simulated/pacing-true/varying-seeds: No change in performance detected.
       time:   [23.676 s 23.676 s 23.676 s]
       thrpt:  [173.01 KiB/s 173.01 KiB/s 173.01 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/simulated/pacing-false/same-seed: No change in performance detected.
       time:   [23.941 s 23.941 s 23.941 s]
       thrpt:  [171.09 KiB/s 171.09 KiB/s 171.09 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/simulated/pacing-true/same-seed: No change in performance detected.
       time:   [23.676 s 23.676 s 23.676 s]
       thrpt:  [173.01 KiB/s 173.01 KiB/s 173.01 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/walltime/pacing-false/varying-seeds: No change in performance detected.
       time:   [23.197 ms 23.224 ms 23.262 ms]
       change: [-0.1192% +0.0181% +0.1858] (p = 0.84 > 0.05)
       No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
3 (3.00%) low mild
6 (6.00%) high mild
1 (1.00%) high severe
transfer/walltime/pacing-true/varying-seeds: No change in performance detected.
       time:   [23.560 ms 23.581 ms 23.606 ms]
       change: [-0.1111% -0.0118% +0.0992] (p = 0.84 > 0.05)
       No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
transfer/walltime/pacing-false/same-seed: Change within noise threshold.
       time:   [23.223 ms 23.239 ms 23.256 ms]
       change: [-1.7388% -1.6404% -1.5339] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
2 (2.00%) high mild
1 (1.00%) high severe
transfer/walltime/pacing-true/same-seed: Change within noise threshold.
       time:   [23.662 ms 23.683 ms 23.704 ms]
       change: [-2.1416% -2.0273% -1.9077] (p = 0.00 < 0.05)
       Change within noise threshold.

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

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