From 41b1c63942383f3dc2ad229ec4901f830c6abcc2 Mon Sep 17 00:00:00 2001 From: ID Bot Date: Thu, 4 Jul 2024 14:07:11 +0000 Subject: [PATCH] Script updating gh-pages from f9e4fda. [ci skip] --- draft-welzl-iccrg-pacing.html | 2 +- draft-welzl-iccrg-pacing.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/draft-welzl-iccrg-pacing.html b/draft-welzl-iccrg-pacing.html index 69c75f4..845887f 100644 --- a/draft-welzl-iccrg-pacing.html +++ b/draft-welzl-iccrg-pacing.html @@ -1322,7 +1322,7 @@

Details of the actual pacing algorithm (e.g. granularity of bursts allowed, etc.).

-

Examples of different approaches to dealing with these challenges in ways that work on multiple operating systems and hardware platforms can be found in open source QUIC stacks, such as Google "quiche" and Meta "mvfst", that provide examples for some of the concepts discussed below.

+

Examples of different approaches to dealing with these challenges in ways that work on multiple operating systems and hardware platforms can be found in open source QUIC stacks, such as Google's QUIC implementation and Meta's "mvfst". These provide examples for some of the concepts discussed below.

Unlike TCP implementations that typically run within the operating system kernel, QUIC implementations more typically run in user space and are thus faced with more challenges regarding timing and coupling with the underlying protocol stack and hardware needed to achieve pacing. For instance, if an application trying to do pacing is running on a highly loaded system, it may often "wake up late" and miss the times that it intends to pace packets.

When a large amount of data needs to be sent, pacing naively could result in an excessive number of timers to be managed and adjusted along with all of the other timers that the QUIC stack and rest of the application require. The Hashed Hierarchical Timing Wheel [VL87] provides one approach for such cases, but implementations may also simply schedule the next send event based on the current pacing rate, and then schedule subsequent events as needed, rather than adjusting timers for them. In any case, typically a pacing algorithm should allow for some amount of burstiness, in order to efficiently use the hardware as well as to be responsive for bursty (but low overall rate) applications, and to avoid excessive timer management.

Pacing can be done based on different approaches such as a token-based or tokenless algorithm. For instance, a tokenless algorithm (e.g. as used in mvfst) might compute a regular interval time and batch size (number of packets) to be released every interval and achieve the pacing rate. This allows specific future transmissions to be scheduled. In contrast, a token-based algorithm accumulates tokens to permit transmission based on the pacing rate, using a "leaky bucket" to control bursts. In this case the size of bursts may be more granular, depending on how much time has elapsed between evaluations.

diff --git a/draft-welzl-iccrg-pacing.txt b/draft-welzl-iccrg-pacing.txt index 3e485fd..dffb1f9 100644 --- a/draft-welzl-iccrg-pacing.txt +++ b/draft-welzl-iccrg-pacing.txt @@ -308,9 +308,9 @@ Table of Contents Examples of different approaches to dealing with these challenges in ways that work on multiple operating systems and hardware platforms - can be found in open source QUIC stacks, such as Google "quiche" and - Meta "mvfst", that provide examples for some of the concepts - discussed below. + can be found in open source QUIC stacks, such as Google's QUIC + implementation and Meta's "mvfst". These provide examples for some + of the concepts discussed below. Unlike TCP implementations that typically run within the operating system kernel, QUIC implementations more typically run in user space