Skip to content

recovery: floor loss delay at observed ack latency - #2568

Open
davidtorcivia wants to merge 2 commits into
cloudflare:masterfrom
halideworks:ack-latency-loss-floor
Open

recovery: floor loss delay at observed ack latency#2568
davidtorcivia wants to merge 2 commits into
cloudflare:masterfrom
halideworks:ack-latency-loss-floor

Conversation

@davidtorcivia

Copy link
Copy Markdown

Acknowledgements are processed in batches and the RTT estimate only samples the freshest packet of each batch. On a path whose RTT is close to or below the granularity of ack processing, the time and packet thresholds declare packets lost whose acknowledgements have not had a chance to be processed yet. Each spurious declaration triggers a retransmission and a congestion event for a packet that was delivered.

This adds enable_ack_latency_loss_floor, off by default. When enabled, the loss delay is floored at the slowest send-to-processed-ack loop observed in the last 512ms, and the packet reordering threshold only applies to packets older than that loop. Both recovery implementations are covered. Behavior with the flag off is unchanged.

Testing

New tests in recovery/mod.rs run against reno, cubic, bbr2 and bbr2_gcongestion: a late ack batch no longer convicts packets younger than the observed loop, and time based detection still fires once a packet outlives the floored delay.

Measured on a 10GbE path with 0.2-0.6ms RTT, six connections carrying 1GB per run with CUBIC, five runs per arm: declared losses fell from 25-30k per run to 1.3-2.3k, spurious losses (declared and later acked) fell from 8-10k to 100-200, and goodput rose from 7.9 to 8.8 Gbit/s median. Packet captures at the receiver NIC showed zero actual path loss in both arms, so the declarations were detector artifacts.

Acknowledgements are processed in batches and the RTT estimate only
samples the freshest packet of each batch. On a path whose RTT is close
to or below the granularity of ack processing, the time and packet
thresholds declare packets lost whose acknowledgements have not had a
chance to be processed yet. Each spurious declaration triggers a
retransmission and a congestion event for a packet that was delivered.

This adds a config option, off by default, that floors the loss delay
at the slowest send-to-processed-ack loop observed in the last 512ms,
and applies the packet reordering threshold only to packets older than
that loop. Both recovery implementations are covered.

Measured on a 10GbE path with 0.2-0.6ms RTT, six connections carrying
1GB with CUBIC: declared losses fell from 25-30k per run to 1.3-2.3k,
acks that disproved a declaration fell from 8-10k to 100-200, and
goodput rose from 7.9 to 8.8 Gbit/s median over five runs.
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.

1 participant