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
The question for today
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.
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.
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.
Work it through
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.
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.
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.
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.
Pacing moves the release schedule rather than increasing capacity. Its benefit here is reduced instantaneous queue occupancy, not a shorter serialization budget.
The living notebook
Explore the model
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.
- Fluid backlog
- 4
- Net rate · λ − μ
- −1 /s
- M/M/1 mean residence
- 1 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.
Pause & reason
Check your understanding
Your turn
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.
Keep the idea
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.