Skip to content

Conversation

mxinden
Copy link
Member

@mxinden mxinden commented Oct 8, 2025

Around 65% of Firefox QUIC connections have an ECN capable path. Conversely 35% of ECN validations fail. Logging an expected validation failure on warn level is too noisy. Thus downgrading the log level to info instead.

Around 65% of Firefox QUIC connections have an ECN capable path. Conversely 35%
of ECN validations fail. Logging an expected validation failure on warn level is
too noisy. Thus downgrading the log level to info instead.
@Copilot Copilot AI review requested due to automatic review settings October 8, 2025 09:16
Copy link
Contributor

@Copilot 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

This PR downgrades ECN validation failure log levels from warning to info to reduce log noise, since 35% of ECN validations are expected to fail on Firefox QUIC connections.

  • Removes the unused qwarn import from neqo_common
  • Changes three ECN validation failure log statements from qwarn! to qinfo!

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@mxinden
Copy link
Member Author

mxinden commented Oct 8, 2025

For what it is worth, ECN stats on latest Firefox Nightly:

image

Copy link

codecov bot commented Oct 8, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.35%. Comparing base (9c920d0) to head (63f1b94).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3033      +/-   ##
==========================================
- Coverage   93.39%   93.35%   -0.04%     
==========================================
  Files         123      123              
  Lines       35884    35884              
  Branches    35884    35884              
==========================================
- Hits        33514    33500      -14     
- Misses       1528     1541      +13     
- Partials      842      843       +1     
Components Coverage Δ
neqo-common 97.41% <ø> (ø)
neqo-crypto 83.25% <ø> (-0.48%) ⬇️
neqo-http3 93.34% <ø> (ø)
neqo-qpack 94.18% <ø> (ø)
neqo-transport 94.40% <100.00%> (-0.03%) ⬇️
neqo-udp 80.48% <ø> (ø)
mtu 85.76% <ø> (ø)

Copy link

github-actions bot commented Oct 8, 2025

Client/server transfer results

Performance differences relative to 9c920d0.

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 vs. google 456.0 ± 4.5 448.7 479.5 70.2 ± 7.1
google vs. neqo (cubic, paced) 276.7 ± 3.9 269.0 284.4 115.6 ± 8.2 -0.4 -0.2%
msquic vs. msquic 174.4 ± 44.5 137.2 402.3 183.5 ± 0.7
msquic vs. neqo (cubic, paced) 196.9 ± 39.3 152.0 379.5 162.5 ± 0.8 8.6 4.6%
neqo vs. google (cubic, paced) 758.0 ± 2.4 753.2 763.3 42.2 ± 13.3 💚 -2.3 -0.3%
neqo vs. msquic (cubic, paced) 157.3 ± 6.5 149.4 187.3 203.4 ± 4.9 0.2 0.1%
neqo vs. neqo (cubic) 91.0 ± 4.4 81.8 105.2 351.5 ± 7.3 0.1 0.1%
neqo vs. neqo (cubic, paced) 91.9 ± 5.3 81.7 107.1 348.4 ± 6.0 0.3 0.4%
neqo vs. neqo (reno) 90.2 ± 4.4 80.7 105.7 354.8 ± 7.3 0.3 0.3%
neqo vs. neqo (reno, paced) 88.4 ± 4.0 81.9 100.0 361.8 ± 8.0 -0.4 -0.4%
neqo vs. quiche (cubic, paced) 194.6 ± 5.1 186.5 212.5 164.4 ± 6.3 0.3 0.1%
neqo vs. s2n (cubic, paced) 221.9 ± 4.3 213.6 241.7 144.2 ± 7.4 0.3 0.2%
quiche vs. neqo (cubic, paced) 154.0 ± 5.1 143.7 171.7 207.8 ± 6.3 -0.1 -0.0%
quiche vs. quiche 145.0 ± 5.5 136.4 173.2 220.8 ± 5.8
s2n vs. neqo (cubic, paced) 172.9 ± 5.4 163.4 197.6 185.1 ± 5.9 -1.0 -0.6%
s2n vs. s2n 251.6 ± 31.2 230.3 352.4 127.2 ± 1.0

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

Copy link

github-actions bot commented Oct 8, 2025

Benchmark results

Performance differences relative to 9c920d0.

1-conn/1-100mb-resp/mtu-1504 (aka. Download)/client: No change in performance detected.
       time:   [201.80 ms 202.32 ms 202.95 ms]
       thrpt:  [492.73 MiB/s 494.27 MiB/s 495.53 MiB/s]
change:
       time:   [−0.3804% −0.0183% +0.3080%] (p = 0.92 > 0.05)
       thrpt:  [−0.3071% +0.0183% +0.3819%]

Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) high mild
2 (2.00%) high severe

1-conn/10_000-parallel-1b-resp/mtu-1504 (aka. RPS)/client: Change within noise threshold.
       time:   [298.39 ms 299.92 ms 301.45 ms]
       thrpt:  [33.173 Kelem/s 33.342 Kelem/s 33.513 Kelem/s]
change:
       time:   [+0.2105% +0.9880% +1.7513%] (p = 0.01 < 0.05)
       thrpt:  [−1.7212% −0.9783% −0.2101%]
1-conn/1-1b-resp/mtu-1504 (aka. HPS)/client: No change in performance detected.
       time:   [28.495 ms 28.590 ms 28.706 ms]
       thrpt:  [34.836   B/s 34.978   B/s 35.094   B/s]
change:
       time:   [−0.1423% +0.3239% +0.8141%] (p = 0.18 > 0.05)
       thrpt:  [−0.8075% −0.3229% +0.1425%]

Found 26 outliers among 100 measurements (26.00%)
4 (4.00%) low severe
1 (1.00%) low mild
21 (21.00%) high severe

1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client: 💔 Performance has regressed.
       time:   [211.94 ms 212.21 ms 212.52 ms]
       thrpt:  [470.55 MiB/s 471.24 MiB/s 471.82 MiB/s]
change:
       time:   [+1.1016% +1.3311% +1.5553%] (p = 0.00 < 0.05)
       thrpt:  [−1.5315% −1.3136% −1.0896%]

Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) high mild
2 (2.00%) high severe

decode 4096 bytes, mask ff: No change in performance detected.
       time:   [11.602 µs 11.631 µs 11.667 µs]
       change: [−1.3184% −0.1790% +0.8795%] (p = 0.78 > 0.05)

Found 11 outliers among 100 measurements (11.00%)
1 (1.00%) low mild
2 (2.00%) high mild
8 (8.00%) high severe

decode 1048576 bytes, mask ff: No change in performance detected.
       time:   [3.0220 ms 3.0357 ms 3.0532 ms]
       change: [−1.0661% −0.0352% +0.8482%] (p = 0.95 > 0.05)

Found 11 outliers among 100 measurements (11.00%)
11 (11.00%) high severe

decode 4096 bytes, mask 7f: No change in performance detected.
       time:   [19.947 µs 20.009 µs 20.081 µs]
       change: [−0.6614% −0.1677% +0.2926%] (p = 0.50 > 0.05)

Found 15 outliers among 100 measurements (15.00%)
2 (2.00%) low severe
1 (1.00%) high mild
12 (12.00%) high severe

decode 1048576 bytes, mask 7f: No change in performance detected.
       time:   [5.0362 ms 5.0474 ms 5.0603 ms]
       change: [−0.8765% −0.2024% +0.3239%] (p = 0.56 > 0.05)

Found 13 outliers among 100 measurements (13.00%)
13 (13.00%) high severe

decode 4096 bytes, mask 3f: No change in performance detected.
       time:   [8.2665 µs 8.2894 µs 8.3192 µs]
       change: [−0.1137% +0.8690% +2.4769%] (p = 0.17 > 0.05)

Found 20 outliers among 100 measurements (20.00%)
5 (5.00%) low severe
5 (5.00%) low mild
1 (1.00%) high mild
9 (9.00%) high severe

decode 1048576 bytes, mask 3f: No change in performance detected.
       time:   [1.5881 ms 1.5950 ms 1.6033 ms]
       change: [−0.4261% +0.1872% +0.8025%] (p = 0.56 > 0.05)

Found 10 outliers among 100 measurements (10.00%)
2 (2.00%) high mild
8 (8.00%) high severe

1-streams/each-1000-bytes/wallclock-time: No change in performance detected.
       time:   [591.61 µs 593.80 µs 596.27 µs]
       change: [−0.0082% +0.5763% +1.1694%] (p = 0.06 > 0.05)

Found 11 outliers among 100 measurements (11.00%)
2 (2.00%) low mild
9 (9.00%) high severe
1-streams/each-1000-bytes/simulated-time
time: [118.78 ms 119.01 ms 119.23 ms]
thrpt: [8.1903 KiB/s 8.2059 KiB/s 8.2217 KiB/s]
change:
time: [−0.3530% −0.1066% +0.1611%] (p = 0.42 > 0.05)
thrpt: [−0.1609% +0.1068% +0.3543%]
No change in performance detected.

1000-streams/each-1-bytes/wallclock-time: Change within noise threshold.
       time:   [13.946 ms 13.972 ms 13.998 ms]
       change: [−0.5527% −0.3006% −0.0518%] (p = 0.03 < 0.05)
1000-streams/each-1-bytes/simulated-time: No change in performance detected.
       time:   [14.993 s 15.006 s 15.019 s]
       thrpt:  [66.582   B/s 66.641   B/s 66.698   B/s]
change:
       time:   [−0.1407% −0.0183% +0.1078%] (p = 0.78 > 0.05)
       thrpt:  [−0.1076% +0.0183% +0.1409%]
1000-streams/each-1000-bytes/wallclock-time: No change in performance detected.
       time:   [49.537 ms 49.764 ms 50.029 ms]
       change: [−0.7375% −0.1196% +0.5794%] (p = 0.73 > 0.05)

Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
1000-streams/each-1000-bytes/simulated-time
time: [18.840 s 19.004 s 19.171 s]
thrpt: [50.939 KiB/s 51.388 KiB/s 51.834 KiB/s]
change:
time: [−1.4985% −0.2349% +1.0241%] (p = 0.71 > 0.05)
thrpt: [−1.0137% +0.2355% +1.5213%]
No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild

coalesce_acked_from_zero 1+1 entries: No change in performance detected.
       time:   [88.577 ns 88.938 ns 89.299 ns]
       change: [−0.1565% +0.7300% +1.7041%] (p = 0.14 > 0.05)

Found 6 outliers among 100 measurements (6.00%)
3 (3.00%) high mild
3 (3.00%) high severe

coalesce_acked_from_zero 3+1 entries: No change in performance detected.
       time:   [106.20 ns 106.50 ns 106.81 ns]
       change: [−0.3735% +0.1900% +0.8495%] (p = 0.55 > 0.05)

Found 12 outliers among 100 measurements (12.00%)
12 (12.00%) high severe

coalesce_acked_from_zero 10+1 entries: No change in performance detected.
       time:   [105.61 ns 106.14 ns 106.76 ns]
       change: [−1.4481% −0.6429% +0.0577%] (p = 0.11 > 0.05)

Found 18 outliers among 100 measurements (18.00%)
6 (6.00%) low severe
4 (4.00%) low mild
1 (1.00%) high mild
7 (7.00%) high severe

coalesce_acked_from_zero 1000+1 entries: No change in performance detected.
       time:   [88.966 ns 89.106 ns 89.269 ns]
       change: [−7.6008% −2.5922% +0.5937%] (p = 0.34 > 0.05)

Found 10 outliers among 100 measurements (10.00%)
4 (4.00%) high mild
6 (6.00%) high severe

RxStreamOrderer::inbound_frame(): Change within noise threshold.
       time:   [109.73 ms 109.87 ms 110.07 ms]
       change: [−0.8797% −0.6956% −0.4802%] (p = 0.00 < 0.05)

Found 21 outliers among 100 measurements (21.00%)
1 (1.00%) low severe
10 (10.00%) low mild
7 (7.00%) high mild
3 (3.00%) high severe

sent::Packets::take_ranges: No change in performance detected.
       time:   [4.5120 µs 4.6066 µs 4.6945 µs]
       change: [−2.9039% −0.2086% +2.5414%] (p = 0.89 > 0.05)

Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild

transfer/pacing-false/varying-seeds/wallclock-time/run: No change in performance detected.
       time:   [26.445 ms 26.486 ms 26.529 ms]
       change: [−0.3578% −0.1075% +0.1343%] (p = 0.39 > 0.05)

Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe

transfer/pacing-false/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [25.120 s 25.154 s 25.189 s]
       thrpt:  [162.61 KiB/s 162.83 KiB/s 163.06 KiB/s]
change:
       time:   [−0.2650% −0.0640% +0.1339%] (p = 0.51 > 0.05)
       thrpt:  [−0.1337% +0.0641% +0.2657%]
transfer/pacing-true/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [26.822 ms 26.898 ms 26.983 ms]
       change: [−1.2303% −0.8332% −0.4533%] (p = 0.00 < 0.05)

Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe

transfer/pacing-true/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [24.919 s 24.959 s 24.999 s]
       thrpt:  [163.85 KiB/s 164.11 KiB/s 164.37 KiB/s]
change:
       time:   [−0.3064% −0.0922% +0.1296%] (p = 0.41 > 0.05)
       thrpt:  [−0.1294% +0.0923% +0.3074%]
transfer/pacing-false/same-seed/wallclock-time/run: Change within noise threshold.
       time:   [26.925 ms 26.948 ms 26.971 ms]
       change: [+0.3194% +0.4226% +0.5292%] (p = 0.00 < 0.05)

Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) high mild

transfer/pacing-false/same-seed/simulated-time/run: No change in performance detected.
       time:   [25.710 s 25.710 s 25.710 s]
       thrpt:  [159.31 KiB/s 159.31 KiB/s 159.31 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000%] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000%]
transfer/pacing-true/same-seed/wallclock-time/run: Change within noise threshold.
       time:   [27.947 ms 27.966 ms 27.986 ms]
       change: [−0.6158% −0.5086% −0.4035%] (p = 0.00 < 0.05)

Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild

transfer/pacing-true/same-seed/simulated-time/run: No change in performance detected.
       time:   [25.675 s 25.675 s 25.675 s]
       thrpt:  [159.53 KiB/s 159.53 KiB/s 159.53 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000%] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000%]

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

Copy link

github-actions bot commented Oct 8, 2025

🐰 Bencher Report

Branchecn-info
TestbedOn-prem

🚨 2 Alerts

BenchmarkMeasure
Units
ViewBenchmark Result
(Result Δ%)
Upper Boundary
(Limit %)
transfer/pacing-false/same-seed/simulated-time/runLatency
seconds (s)
📈 plot
🚷 threshold
🚨 alert (🔔)
25.71 s
(+2.17%)Baseline: 25.16 s
25.35 s
(101.43%)

transfer/pacing-true/same-seed/simulated-time/runLatency
seconds (s)
📈 plot
🚷 threshold
🚨 alert (🔔)
25.68 s
(+0.33%)Baseline: 25.59 s
25.62 s
(100.22%)

Click to view all benchmark results
BenchmarkLatencyBenchmark Result
nanoseconds (ns)
(Result Δ%)
Upper Boundary
nanoseconds (ns)
(Limit %)
1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client📈 view plot
🚷 view threshold
212,210,000.00 ns
(+1.04%)Baseline: 210,021,600.00 ns
217,291,598.08 ns
(97.66%)
1-conn/1-100mb-resp/mtu-1504 (aka. Download)/client📈 view plot
🚷 view threshold
202,320,000.00 ns
(-0.86%)Baseline: 204,082,733.33 ns
212,273,537.15 ns
(95.31%)
1-conn/1-1b-resp/mtu-1504 (aka. HPS)/client📈 view plot
🚷 view threshold
28,590,000.00 ns
(+0.66%)Baseline: 28,401,233.33 ns
28,887,366.30 ns
(98.97%)
1-conn/10_000-parallel-1b-resp/mtu-1504 (aka. RPS)/client📈 view plot
🚷 view threshold
299,920,000.00 ns
(+1.32%)Baseline: 296,011,066.67 ns
305,199,859.33 ns
(98.27%)
1-streams/each-1000-bytes/simulated-time📈 view plot
🚷 view threshold
119,010,000.00 ns
(+0.70%)Baseline: 118,181,466.67 ns
120,863,474.92 ns
(98.47%)
1-streams/each-1000-bytes/wallclock-time📈 view plot
🚷 view threshold
593,800.00 ns
(-1.09%)Baseline: 600,350.60 ns
624,146.10 ns
(95.14%)
1000-streams/each-1-bytes/simulated-time📈 view plot
🚷 view threshold
15,006,000,000.00 ns
(+0.10%)Baseline: 14,991,320,000.00 ns
15,010,078,756.35 ns
(99.97%)
1000-streams/each-1-bytes/wallclock-time📈 view plot
🚷 view threshold
13,972,000.00 ns
(-2.35%)Baseline: 14,308,313.33 ns
14,936,405.04 ns
(93.54%)
1000-streams/each-1000-bytes/simulated-time📈 view plot
🚷 view threshold
19,004,000,000.00 ns
(+0.62%)Baseline: 18,886,886,666.67 ns
19,100,791,793.25 ns
(99.49%)
1000-streams/each-1000-bytes/wallclock-time📈 view plot
🚷 view threshold
49,764,000.00 ns
(-5.81%)Baseline: 52,831,573.33 ns
59,050,095.31 ns
(84.27%)
RxStreamOrderer::inbound_frame()📈 view plot
🚷 view threshold
109,870,000.00 ns
(-0.09%)Baseline: 109,971,666.67 ns
112,110,012.67 ns
(98.00%)
coalesce_acked_from_zero 1+1 entries📈 view plot
🚷 view threshold
88.94 ns
(+0.32%)Baseline: 88.66 ns
89.32 ns
(99.57%)
coalesce_acked_from_zero 10+1 entries📈 view plot
🚷 view threshold
106.14 ns
(-0.00%)Baseline: 106.14 ns
107.11 ns
(99.10%)
coalesce_acked_from_zero 1000+1 entries📈 view plot
🚷 view threshold
89.11 ns
(-0.84%)Baseline: 89.86 ns
94.49 ns
(94.30%)
coalesce_acked_from_zero 3+1 entries📈 view plot
🚷 view threshold
106.50 ns
(-0.14%)Baseline: 106.65 ns
107.59 ns
(98.98%)
decode 1048576 bytes, mask 3f📈 view plot
🚷 view threshold
1,595,000.00 ns
(+0.15%)Baseline: 1,592,670.00 ns
1,599,975.36 ns
(99.69%)
decode 1048576 bytes, mask 7f📈 view plot
🚷 view threshold
5,047,400.00 ns
(-0.18%)Baseline: 5,056,399.33 ns
5,075,795.24 ns
(99.44%)
decode 1048576 bytes, mask ff📈 view plot
🚷 view threshold
3,035,700.00 ns
(+0.13%)Baseline: 3,031,626.67 ns
3,043,700.39 ns
(99.74%)
decode 4096 bytes, mask 3f📈 view plot
🚷 view threshold
8,289.40 ns
(-0.09%)Baseline: 8,296.56 ns
8,343.93 ns
(99.35%)
decode 4096 bytes, mask 7f📈 view plot
🚷 view threshold
20,009.00 ns
(+0.01%)Baseline: 20,006.00 ns
20,087.35 ns
(99.61%)
decode 4096 bytes, mask ff📈 view plot
🚷 view threshold
11,631.00 ns
(-1.01%)Baseline: 11,749.11 ns
11,994.00 ns
(96.97%)
sent::Packets::take_ranges📈 view plot
🚷 view threshold
4,606.60 ns
(-3.12%)Baseline: 4,754.73 ns
4,998.31 ns
(92.16%)
transfer/pacing-false/same-seed/simulated-time/run📈 view plot
🚷 view threshold
🚨 view alert (🔔)
25,710,000,000.00 ns
(+2.17%)Baseline: 25,163,310,810.81 ns
25,348,259,478.24 ns
(101.43%)

transfer/pacing-false/same-seed/wallclock-time/run📈 view plot
🚷 view threshold
26,948,000.00 ns
(+3.13%)Baseline: 26,129,810.81 ns
27,003,974.42 ns
(99.79%)
transfer/pacing-false/varying-seeds/simulated-time/run📈 view plot
🚷 view threshold
25,154,000,000.00 ns
(-0.04%)Baseline: 25,164,479,729.73 ns
25,208,384,749.63 ns
(99.78%)
transfer/pacing-false/varying-seeds/wallclock-time/run📈 view plot
🚷 view threshold
26,486,000.00 ns
(+0.08%)Baseline: 26,465,493.24 ns
27,227,931.28 ns
(97.28%)
transfer/pacing-true/same-seed/simulated-time/run📈 view plot
🚷 view threshold
🚨 view alert (🔔)
25,675,000,000.00 ns
(+0.33%)Baseline: 25,589,763,513.51 ns
25,618,599,596.07 ns
(100.22%)

transfer/pacing-true/same-seed/wallclock-time/run📈 view plot
🚷 view threshold
27,966,000.00 ns
(+1.19%)Baseline: 27,636,655.41 ns
28,508,778.05 ns
(98.10%)
transfer/pacing-true/varying-seeds/simulated-time/run📈 view plot
🚷 view threshold
24,959,000,000.00 ns
(-0.14%)Baseline: 24,994,006,756.76 ns
25,044,409,278.51 ns
(99.66%)
transfer/pacing-true/varying-seeds/wallclock-time/run📈 view plot
🚷 view threshold
26,898,000.00 ns
(-0.39%)Baseline: 27,002,506.76 ns
27,759,595.24 ns
(96.90%)
🐰 View full continuous benchmarking report in Bencher

@mxinden mxinden marked this pull request as ready for review October 8, 2025 12:34
@mxinden mxinden added this pull request to the merge queue Oct 8, 2025
Merged via the queue into mozilla:main with commit 4796153 Oct 8, 2025
130 of 133 checks passed
@mxinden mxinden deleted the ecn-info branch October 8, 2025 12:49
Copy link

github-actions bot commented Oct 8, 2025

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to 9c920d0.

neqo-latest as client

neqo-latest as server

All results

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

@mxinden mxinden mentioned this pull request Oct 14, 2025
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