Packet Path/

Microbursts Explained: Why a Link at 5% Utilization Still Drops Packets

A link at 5% average utilization can still be dropping packets — in microseconds your monitoring averages away. The incast arithmetic that sizes the spike, the shared-buffer rules that decide whose packets spill, and how to catch a microburst in the act.

Data Center · Intermediate · 10 min · October 21, 2026

Illustration: rows of teal data-center servers streaming golden packets into a switch whose glass buffer tank overflows with amber liquid, packets spilling out the far side, on a dark navy background

Picture a stadium emptying after a match. Thousands reach one exit at once. The exit passes them at a steady pace, so the crowd piles up — and some get turned away. Now picture them leaving as a slow trickle over an hour: nobody queues. The corridor is identical. What changed is when everyone arrived.

A switch has the same problem, with water instead of people. Imagine a sink fed by many bathroom taps, all on at once. The drain — one outgoing link — empties at its own fixed speed, so water piles up faster than it can leave; once the basin is full, the next water in spills. On a network, the basin is the switch's buffer (memory holding packets — data's small traveling chunks — while they wait to leave); spilling is a drop: the packet is gone. Spread over the hour, the average flow was a trickle. The sink still overflowed.

In plain EnglishA microburst is a spike lasting microseconds to a few milliseconds — too short for monitoring graphs to see, long enough to overflow a switch buffer and drop packets. Many senders firing at once into one outgoing link is the classic cause: average utilization can read 5% while, for a few microseconds, the link was completely full and spilling. Below: the arithmetic, why graphs hide it, and the fixes.

What a microburst actually is

A microburst is traffic arriving at line rate — the port's full speed — for microseconds to a few milliseconds, far faster than the one outgoing port can drain, because many inputs converge on one output.

Nothing is malfunctioning — every sender is legal and normal. It is pure arithmetic: ten taps, one drain, and a finite buffer. Ask for more waiting room than exists, and the excess drops — though the same traffic spread over a second would pass unqueued.

Why your graphs swear nothing happened

Interface utilization — every dashboard's "how busy is this link" number — is averaged over 30 seconds to 5 minutes, and averaging smears a microsecond spike flat.

Run the numbers on the burst in the worked example below: 2,097,152 bytes is 16.78 megabits — spread over a 5-minute average, about 56 kilobits per second. On a 100 Gb/s link that is nothing: the graph shows an idle link. Yet for a few microseconds that link was completely full, its buffer overflowed, and packets died.

One link, two truths The 5-minute average view ≈ 56 kb/s — the link looks idle The microsecond view 100 Gb/s: full and overflowing

The incast math: 32 senders, one exit

The pattern has a name: incast — many senders answering one request at once. Step by step: 32 senders each send 64 KiB (65,536 bytes) at 100 Gb/s into one 100 Gb/s outgoing port.

  1. The arrival window. One 64 KiB burst at 100 Gb/s takes 65,536 × 8 ÷ 100,000,000,000 ≈ 5.24 microseconds. and all 32 land inside that same window.
  2. Total in. 32 × 65,536 = 2,097,152 bytes arrive.
  3. Drained during arrival. The port forwards at 100 Gb/s throughout, draining exactly one sender's worth in the window: 65,536 bytes.
  4. Peak queue. 2,097,152 − 65,536 = 2,031,616 bytes — about 1.94 MiB — must sit in the buffer at the peak. A smaller buffer, or queue share, drops the difference.
  5. The wait. The last byte waits behind 2,031,616 draining bytes: 2,031,616 × 8 ÷ 100,000,000,000 ≈ 162.5 microseconds.

The pocket version: at equal speeds the port drains one sender's burst during arrival — so peak queue ≈ (number of senders − 1) × burst size. Check: 31 × 64 KiB = 2,031,616 bytes. Double the senders or the burst, double the queue.

Incast: 32 senders, one exit Server 1 Server 2 ⋮ Server 32 each sends 64 KiB at 100 Gb/s Switch queue fills in ≈ 5.24 µs one output100 Gb/s peak queue ≈ 1.94 MiB (2,031,616 bytes) last byte waits ≈ 162.5 µs

Buffers are a shared pool, not a private bucket

Picture each port with a private bucket of buffer? On many data-center switches, all ports draw from one shared buffer pool instead — mostly kind, since a quiet port's spare memory absorbs a busy port's burst, but one port's microburst can drink the pool and starve the rest.

Dynamic thresholds decide who gets how much: a queue may grow up to alpha × (the pool still free). One busy queue settles near alpha·P/(1+alpha) of pool P. With a 16 MiB pool and alpha = 2: 2 × 16 ÷ 3 ≈ 10.67 MiB — most of the pool, for one queue. But the limit is alive: as other queues fill, your allowance shrinks with the free pool.

Why not make the pool enormous? A buffer is a waiting room, and every byte queued is delay. A packet surviving a giant buffer may arrive too late to matter — a drop problem traded for a latency problem: bufferbloat, in plain words. Thresholds are a dial between drops and delay, never a free fix.

Where microbursts come from

How to detect one

Start with the fingerprint: output-drop counters climbing while average utilization looks low — the signature of traffic averaging cannot see.

How to fix one

One special case: on lossless RoCE traffic, packets must never drop — a switch that would drop instead sends a PFC pause upstream, so bursts surface as pauses, not drops. Our RoCEv2 explainer and the planner below cover that world.

Five mistakes that keep microbursts invisible

  1. Trusting the 5-minute graph. An average over an eternity, set against microsecond events — it cannot see them.
  2. Buying a bigger-buffer switch before measuring queue depth. Unmeasured, the fix is a guess — and may just convert drops into latency.
  3. Raising thresholds until latency explodes. Growing queues do not remove congestion; they store it — as delay.
  4. Blaming the application for retransmits the network caused. The app retransmits because a packet vanished in a burst — symptom, not disease. Fix the drop.
  5. Averaging "finer" — to 1 second — and declaring victory. A microsecond-scale event still smears into invisibility — measure at that scale or not at all.

Try it yourself

Feel the arithmetic with three free tools. The QoS token-bucket simulator shows burst size versus drain rate filling and emptying a bucket. The RoCEv2 Lossless Ethernet Planner runs an incast queue-buildup simulation — try the 32-sender case. And the Bandwidth-Delay Product calculator shows how much data a fast link holds in flight. When the real question is whether the switch itself absorbs the burst or drops it, the Microburst Buffer Planner is the shared-buffer and dynamic-threshold (alpha) sizing step: it computes the peak queue, how much of the shared pool the burst occupies, and the bytes that spill.

Key takeaways

Keep reading