advanced24 min studyLesson 186 in Engineering

Pacing controls timing while queues determine waiting

Calculate serialization and queue delay, distinguish pacing from rate limits, and evaluate active queue management without assuming large buffers solve overload.

On this page

What you’ll understand

  • Compute packet spacing and queue-drain time with consistent units.
  • Explain why identical average rates can produce different burst queues.
  • Separate sender pacing, shaping, scheduling, and active queue management.

Two senders can transmit the same number of bytes in a second while imposing very different delays on neighboring traffic. One sends evenly; the other emits a burst and then goes quiet. Average rate hides that timing difference. This lesson connects serialization, pacing, and queue occupancy so a full link is not mistaken for a healthy link, and a large buffer is not mistaken for free capacity.

A link serves bytes over time, not all at once

At a fixed service rate, serializing a packet takes its size divided by that rate. A burst arriving much faster than service cannot all depart immediately; excess bytes wait or are dropped. This happens even when the sender's long-run average equals the link's capacity. Packet size, lower-layer overhead, and the exact accounting point matter when converting a configured rate into spacing. A payload-byte budget and a wire-byte budget are different contracts. For an illustrative calculation, state which bytes count rather than silently assuming that every captured byte occupies only payload time.

Pacing spaces transmissions over time instead of releasing all newly permitted data as one burst. A congestion controller can set a target rate while a pacer determines when individual packets become eligible. The congestion window still limits outstanding load; pacing does not remove flow-control or congestion-control obligations. Host timers, batching, hardware queues, and offload can coarsen the intended schedule, so a software pacing setting is not proof of smooth wire timing. Measure at a suitable observation point and account for capture aggregation before attributing an apparent large packet or tight burst to the actual physical transmission.

Δt=Lr,Tqueue≈QC\Delta t=\frac{L}{r},\qquad T_{\rm queue}\approx\frac{Q}{C}
L is the accounted packet size in bytes and r the pacing rate in bytes per second. Queue Q bytes served at C bytes per second adds approximately Q/C seconds under a single FIFO constant-service model, excluding propagation and other queues.↔ Scroll wide equations horizontally.

Large buffers can convert overload into persistent delay

Buffers absorb transient mismatches and can preserve utilization when bursts arrive. But a deep standing queue can keep packets waiting long after enough data is already in flight to keep the path busy. Interactive traffic then waits behind bulk traffic despite apparently excellent throughput. This persistent excess waiting is the engineering problem called bufferbloat. Increasing capacity may help a particular workload, but merely increasing queue capacity can conceal overload and postpone congestion feedback. A full buffer is not an achievement if the user's useful request has already missed its deadline before reaching service.

Active queue management tries to signal congestion before a queue remains persistently full, using drops or ECN marks under its particular algorithm. CoDel, for example, examines queue sojourn behavior rather than treating every instantaneous burst as equally harmful. Queue management is different from scheduling: a scheduler chooses which queued work receives service, while a queue-management policy decides when to mark or discard. Combining them can protect interactive flows, but neither creates extra physical bandwidth. State the measured latency, loss, and throughput goals before comparing policies, and include mixtures of short and sustained flows rather than one convenient average.

dQdt=λ−C(Q>0),tdrain=Q0C−λ(λ<C)\frac{dQ}{dt}=\lambda-C\quad(Q>0),\qquad t_{\rm drain}=\frac{Q_0}{C-\lambda}\quad(\lambda<C)
Q is bytes in a constant-rate fluid FIFO queue, λ and C are bytes per second, and drain time is seconds. The expression assumes fixed arrivals below service, no finite cap, and no stochastic bursts; the backlog is clipped at zero.↔ Scroll wide equations horizontally.

Ask where the burst is introduced

A smooth application can still feed a bursty network if a runtime batches writes, a sender releases a large acknowledgment-driven flight, or a lower queue drains into a slower link. Conversely, application batching can improve CPU efficiency while a later pacer controls network timing. Inspect the entire path from application queue through socket, host scheduler, device queue, and bottleneck. End-to-end RTT alone does not identify which queue contributes delay. Pair it with host and device counters, workload timing, and controlled changes to offered load so that a plausible explanation becomes a testable mechanism.

The queue lab compares separate constant-rate runs. Reset, explicitly set both λ=2 and μ=2, predict backlog four remaining constant, then Play or Step. Reset again, re-set BOTH λ=1.5 and μ=2, and predict draining from four at t=0 to zero at t=8 seconds before playback. Editing a rate retains t and recalculates from four rather than continuing the prior backlog. Neither run compares packet schedules with identical average rates; use the worked burst example for that. The separate M/M/1 value is not CoDel's sojourn measurement, and the diagram contains no pacer or active queue management.

One burst and one paced train

Ignore headers and propagation. A 10-million-byte-per-second FIFO link is initially empty. Ten 1,000-byte packets become ready together; compare immediate enqueueing with ideal spacing at the link service rate.

  1. Each packet needs 1,000/10,000,000=0.0001 seconds, or 0.1 milliseconds, of service. The ten packets require one millisecond of total serialization either way.

  2. If all enqueue together, the final packet waits behind nine packets: 9,000/10,000,000=0.0009 seconds, or 0.9 milliseconds, before its own service begins.

  3. If packet starts are ideally paced 0.1 milliseconds apart and service begins immediately, each reaches an available link with essentially no waiting in this simplified queue. The transfer still consumes one millisecond from first service start to final completion.

The result

Pacing moves the release schedule rather than increasing capacity. Its benefit here is reduced instantaneous queue occupancy, not a shorter serialization budget.

Explore the model

Interactive lab

Interactive lab · queue

Drain a standing queue deliberately

Before EACH run Reset, explicitly re-set BOTH rates, predict, then Play or Step. Compare (λ,μ)=(2,2) with (1.5,2), both starting from four at t=0; the second drains at 0.5 units/s and empties at t=8 seconds. Parameter edits retain t and recompute a new constant-rate curve, not a switched-rate history. No packets, pacer, ECN marking, or AQM algorithm are simulated.

Drain a standing queue deliberatelyFluid backlog starts at 4 and follows max(0, 4 + (λ − μ)t). The separate M/M/1 residence-time formula assumes Poisson arrivals, exponential service and λ < μ. Current readings: Fluid backlog: 4; Net rate · λ − μ: −1 /s; M/M/1 mean residence: 1 s. All parameters are adjustable with the labeled controls below.02.557.51001.534.56Elapsed time · sFluid backlogλ < μ
Fluid backlogCurrent time
Fluid backlog
4
Net rate · λ − μ
−1 /s
M/M/1 mean residence
1 s
t = 0 s

Fluid backlog starts at 4 and follows max(0, 4 + (λ − μ)t). The separate M/M/1 residence-time formula assumes Poisson arrivals, exponential service and λ < μ. Parameter changes pause playback and recompute the model at the current elapsed time. Reset restores both parameters and returns time to zero. Playback starts paused. Adjust either parameter, then choose Play or Step.

Look forA standing queue needs a period of service exceeding arrivals to drain; equal average rates alone do not erase waiting.

Check your understanding

A pacing change preserves bulk goodput but reduces loaded RTT. What is a plausible mechanism to investigate?

Try it yourself

A FIFO holds 500,000 bytes and serves 5,000,000 bytes per second. Arrivals continue at 4,000,000 bytes per second. Estimate current queueing delay for a new tail arrival and the time needed to drain the standing backlog.

Take a moment to make a prediction or work it out on paper. Open a hint when you need one.

Give me a hint

Tail waiting uses service rate; backlog draining uses the difference between service and ongoing arrivals.

Compare with the solution

The approximate tail waiting contribution is 500,000/5,000,000=0.1 seconds. The backlog drains at 1,000,000 bytes per second, so it takes 0.5 seconds to empty under constant rates. The quantities differ because new arrivals keep adding work while the old backlog drains.

Take it with you

  • Pacing controls transmission timing while a window controls outstanding permission.
  • Queue capacity absorbs bursts but can also sustain harmful waiting.
  • Queue management, scheduling, and physical capacity solve different parts of congestion.

Read further

Original sources and deeper explanations to follow at your own pace.

Optional progress, saved in this browser when available. Revisit any lesson at any time.

Lesson not marked complete.