Problem
Exist Scheduler - WLB is loss-aware but not jitter-aware.
SRT user report: WAN2 RTT spike with no loss → WLB keeps sending to WAN2 → congestion spiral.
#29
Ysurac/openmptcprouter#4277
Workaround
Exist Scheduler - MinRTT picks lowest-SRTT path per packet, spills on cwnd-block. Naturally avoids the WLB spiral. Recommended workaround for typical SRT/RTP/WebRTC. but MinRTT scheduler has some Gaps.
Gaps:
G1. No hysteresis → flaps on close SRTTs
G2. No rttvar penalty → low-SRTT but unstable path wins over steady one
G3. No latency-budget admission → keeps sending after SRT buffer is exceeded
G4. Reactive spillover only (cwnd-block is a late signal)
G5. No active aggregation when bitrate > single path capacity
Proposal(TBD)
Add opt-in realtime scheduler in xquic fork (xqc_scheduler_realtime.{c,h}).
Latency-budget filter + jitter/RTT-inflation penalty + hysteresis. No flow pinning.
exist scheduler(WLB minRTT) stays untouched.
- A. Enhance
min_srtt with hysteresis + rttvar/budget filters.
Closes G1–G3.
- B. New opt-in
realtime scheduler. Closes G1–G5, adds bonded WRR mode for G5.
admission: srtt < budget && rttvar/srtt < tolerance
fitness : 1 / (srtt × (1 + γ·(srtt/min_rtt − 1)))
hysteresis: switch only on fitness ≥ 1.2× current
References
BBR (srtt/min_rtt), CoDel (queue delay), BLEST (RTT-diff penalty).
Problem
Exist Scheduler - WLB is loss-aware but not jitter-aware.
SRT user report: WAN2 RTT spike with no loss → WLB keeps sending to WAN2 → congestion spiral.
#29
Ysurac/openmptcprouter#4277
Workaround
Exist Scheduler - MinRTT picks lowest-SRTT path per packet, spills on cwnd-block. Naturally avoids the WLB spiral. Recommended workaround for typical SRT/RTP/WebRTC. but MinRTT scheduler has some Gaps.
Gaps:
G1. No hysteresis → flaps on close SRTTs
G2. No
rttvarpenalty → low-SRTT but unstable path wins over steady oneG3. No latency-budget admission → keeps sending after SRT buffer is exceeded
G4. Reactive spillover only (cwnd-block is a late signal)
G5. No active aggregation when bitrate > single path capacity
Proposal(TBD)
Add opt-in
realtimescheduler in xquic fork (xqc_scheduler_realtime.{c,h}).Latency-budget filter + jitter/RTT-inflation penalty + hysteresis. No flow pinning.
exist scheduler(WLB minRTT) stays untouched.
min_srttwith hysteresis + rttvar/budget filters.Closes G1–G3.
realtimescheduler. Closes G1–G5, adds bonded WRR mode for G5.admission: srtt < budget && rttvar/srtt < tolerance
fitness : 1 / (srtt × (1 + γ·(srtt/min_rtt − 1)))
hysteresis: switch only on fitness ≥ 1.2× current
References
BBR (
srtt/min_rtt), CoDel (queue delay), BLEST (RTT-diff penalty).