Back to blog

Broken by Design  ·  Queueing · How Networks Fail · October 2026

Broken by Design
The Link Isn’t Slow,
the Queue Is Full

The speed test says the line is fast. Yet the moment someone uploads a file, the video call turns to slideshow, the game lags, and a ping that was 12 ms is suddenly 800. The bandwidth is fine — the problem is a buffer somewhere filling to the brim, so every latency-sensitive packet waits behind a backlog of bulk traffic. This is bufferbloat, and it is a queueing failure, not a capacity one.

Broken by Design Bufferbloat Latency AQM CAKE fq_codel

Bandwidth and latency are different things, and a buffer trades one for the other. A buffer exists to absorb a brief burst so packets are not dropped — useful, in moderation. But the buffers in a lot of consumer modems, NICs and drivers are enormous and unmanaged, and TCP, by design, fills any buffer it finds until it sees a drop. So under sustained load the bottleneck buffer fills to the top and stays full.

Once it is full, every new packet — including a tiny, urgent VoIP or game packet — has to sit behind the entire backlog of bulk data before it is sent. That wait is pure added latency: a 12 ms link becomes a 500–800 ms one, while the throughput graph looks perfect. This is bufferbloat, and because the speed test still passes, it is routinely misdiagnosed as “the internet is slow” when it is really “the queue is mismanaged.”

Part of

01

A Full Buffer, and the Latency It Hides

Left, the unmanaged buffer is full and the urgent packet waits behind the backlog — ping spikes. Right, AQM keeps the queue short — ping stays low at the same bandwidth.

latency under load lowhigh Unmanaged buffer: FULL a big download fills the buffer; the small call packet (red) is stuck at the back AQM (CAKE): queue kept SHORT AQM signals senders early, so the small call packet goes almost straight out Same download, same bandwidth — the only difference is how the queue is managed. Bufferbloat is latency hiding inside a “fast” link. The fix is the queue, not more Mbps.

More bandwidth does not fix this; it just takes a little longer to fill a bigger buffer. The only cure is to manage the queue so it never builds a standing backlog — which means the queue has to live somewhere you control, not in the ISP’s modem.

02

Why It Happens

Big dumb buffers plus greedy TCP, at a bottleneck you do not manage.

IngredientRole
Oversized unmanaged buffersModems, NICs and drivers ship with huge FIFO buffers — room to build a half-second of backlog.
TCP fills any bufferLoss-based congestion control keeps sending faster until it sees a drop, so it drives the buffer to full.
Bottleneck in the ISP gearIf the standing queue forms in the modem, your router’s QoS cannot touch it.
Speed test hides itThroughput is unaffected — the damage is latency, which a Mbps number does not show.

03

The Symptoms

Idle latency fine, load latency terrible — the gap between the two is the whole diagnosis.

What you seeWhat it tells you
Ping 12 ms idle, 500–800 ms under loadA standing queue forming at the bottleneck — textbook bufferbloat.
Calls/games fall apart when someone uploadsUplink buffer fills; small packets wait behind the upload.
Speed test fast, experience badPlenty of bandwidth, badly managed latency.
A bufferbloat test grades C–FDirect measurement of the latency-under-load gap.

04

The Fix: Move the Queue Somewhere You Manage

Put modern AQM at the bottleneck and set the rate just under the real line speed, so the standing queue forms in your router where the algorithm can keep it short.

CAKE (or fq_codel) is an active queue-management discipline that signals senders to slow down before a big backlog builds, and shares the link fairly per flow so one bulk transfer cannot monopolise it. The crucial detail is the rate limit: set it a little under what the line actually delivers, so the bottleneck — and therefore the queue — sits in your router, not in the ISP’s modem where AQM cannot reach.

CAKE at ~90% of the real line rate (RouterOS)
/queue type
add name=cake-up kind=cake cake-diffserv=diffserv4 cake-nat=yes cake-flowmode=dual-srchost
/queue tree
add name=up parent=ether1-wan queue=cake-up max-limit=18M    # ~90% of a 20M uplink
# NOTE: no FastTrack — fast-tracked packets skip the queue entirely
/ip firewall filter remove [find action=fasttrack-connection]
⚠ Gotcha — set the limit too high and the queue escapes you

If you shape at or above the real line rate, the bottleneck stays in the ISP’s modem and the standing queue forms there, where CAKE has no control — so bufferbloat persists even though you “added QoS.” Set it a touch under measured throughput (start ~90%, tune down until the latency-under-load gap closes). And never FastTrack: a fast-tracked connection bypasses the queue, which is the one thing you are trying to run it through.

05

Catch It in 30 Seconds Field check

Ping while you saturate the link. The jump from idle to loaded is bufferbloat, measured.

Measure the latency-under-load gap
# baseline: ping while the link is idle
ping -c 20 1.1.1.1            # e.g. ~12 ms
# now saturate the UPLINK and ping again at the same time
# (start a big upload, or: iperf3 -c HOST -t 30 & )
ping -c 20 1.1.1.1            # 500-800 ms under load = bufferbloat
# or just run a browser bufferbloat grade (waveform / dslreports)

A ping that is fine at idle and explodes under load is the entire diagnosis — no deeper tooling needed. Put CAKE at the bottleneck, sized under the line rate, re-run the test, and the loaded ping should stay within a few milliseconds of idle.

Takeaways

  1. Bandwidth and latency are different — a full buffer trades latency away while the Mbps number looks fine.
  2. Oversized unmanaged buffers + greedy TCP build a standing backlog that every urgent packet waits behind.
  3. More bandwidth does not fix it — it just fills a bigger buffer; the queue is the problem.
  4. AQM (CAKE / fq_codel) is the cure — it keeps the queue short and shares the link fairly per flow.
  5. Set the rate under the real line speed so the queue lives in your router, not the ISP modem — and never FastTrack past it.
  6. Ping under load to prove it — the idle-to-loaded latency gap is the whole measurement.

Fast line, terrible calls the moment anyone uploads?

Bufferbloat is a queueing problem that no amount of bandwidth fixes. I put modern AQM (CAKE / fq_codel) at the real bottleneck, sized so the queue lives where it can be managed, and your calls stay smooth under load.

Book a Discovery Call →