awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

Bufferbloat и перегрузка

Суть Огромные буферы на границе сети заменяют потери задержкой — насыщенный канал удерживает 100-500 мс в очереди, ломая интерактивные приложения, пока throughput остаётся зелёным.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 12 min

Кто-то в команде на видеозвонке, и голос постоянно прерывается — но speed test показывает 300 Мбит/с, зелёный. В это время в фоне идёт резервное копирование в облако. Пропускная способность в норме. Задержка — нет. У этого есть название.

Буфер, который съел вашу задержку

Сетевой буфер существует для сглаживания всплесков: когда пакеты приходят быстрее, чем канал их отправляет, они ждут в очереди, а не отбрасываются. В умеренных количествах — это нормально. Bufferbloat — это сбой от избытка.

Граница интернета — кабельные модемы DOCSIS, LTE-модемы, домашние роутеры — это место, где быстрая сторона (гигабитная LAN) встречается с медленной (тарифный аплинк). Это узкое место, и вендоры перестарались с буферами именно там. Модем может держать 100–500 мс буферизованных данных. При насыщении каждый пакет, стоящий за полной очередью резервной копии, ждёт полную глубину этого буфера.

Симптом узнаётся мгновенно, как только знаешь о нём: idle ping — 20 мс, кто-то начинает загрузку, и ping растёт до 300–500 мс. Throughput выглядит отлично — канал полностью загружен — но каждый интерактивный пакет (DNS-запрос, SYN, видеокадр) стоит за bulk-передачей. Звонки прерываются, игры лагают, страницы зависают — и всё это пока speed test зелёный.

Почему TCP нуждается в отбрасывании пакетов

Глубинная причина — несоответствие между буферами и управлением перегрузкой. Потерь-ориентированный TCP — CUBIC, стандарт Linux годами — не имеет другого способа узнать, что канал заполнен. Он продолжает увеличивать окно передачи до тех пор, пока пакет не отбрасывается, воспринимает потерю как «труба полна» и откатывается.

Правильно настроенный буфер отбрасывает пакет рано, когда очередь ещё мелкая, так что TCP получает сигнал перегрузки при ещё низкой задержке. Огромный буфер поглощает пакет вместо этого. TCP не видит потери, предполагает, что есть место, и отправляет ещё данных — которые гигантский буфер тоже поглощает. Окно раздувается, пока буфер не заполняется полностью, на сотни миллисекунд. Вендоры думали, что «никогда не терять пакеты» — безопасный выбор. Это прямо противоположно истине: скрывая сигнал перегрузки, избыточная буферизация гарантирует глубокую очередь.

Bufferbloat: быстрый справочник
Глубина буфера (DOCSIS / LTE)
100–500 мс данных в очереди
Ping idle vs насыщение (без AQM)
20 мс → 300–500 мс
Ping насыщение с fq_codel / CAKE
держится ниже ~30 мс
CUBIC через GEO (~600 мс RTT)
голодает — окна отправлены до возврата потери
Восстановление throughput BBR на GEO
большая часть ёмкости канала, независимо от потерь
RTT LEO (Starlink, орбита ~550 км)
~50–60 мс — CUBIC работает как наземный

Почему это продолжается

Bufferbloat известен с 1980-х годов, но он везде до сих пор. Три причины:

  1. Неверный стимул. Вендоры воспринимали отбрасывание пакетов как дефект и перестарались с буферами, чтобы «избегать потерь» — неверное исправление, потому что потеря и есть сигнал.
  2. Невидимая метрика. Домашние пользователи измеряют throughput, не задержку под нагрузкой. Speed test работает на иначе-простаивающем канале и никогда не видит bloat. Проблема проявляется только когда интерактивное приложение борется с bulk-передачей.
  3. Задержка развёртывания. Исправление поставляется в прошивке. Нужен роутер с Smart Queue Management (SQM), а много операторского оборудования никогда не получает это обновление.

Само исправление несложное.

Active Queue Management

Active Queue Management (AQM) — в маркетинге Smart Queue Management на домашних роутерах — отбрасывает или ECN-маркирует пакеты рано и честно, до того как очередь вырастает, восстанавливая сигнал перегрузки, который нужен TCP.

  • fq_codel (RFC 8290) — flow-queued CoDel. CoDel («Controlled Delay») отслеживает время ожидания пакетов в очереди, не их количество; как только время ожидания превышает цель (~5 мс) слишком долго, начинается отбрасывание. Flow-queue разделяет потоки на отдельные подочереди, чтобы один bulk-upload не заглушал latency-sensitive поток.
  • PIE (RFC 8033) — Proportional Integral controller Enhanced. Оценивает задержку очереди и отбрасывает с вероятностью, настроенной на удержание задержки около цели. PIE — это AQM, обязательный для DOCSIS 3.1, поэтому он в современных кабельных модемах.
  • CAKE — Common Applications Kept Enhanced. fq_codel плюс встроенное формирование полосы, честность per-host и компенсация framing DOCSIS/ATM. Его обычно выбирают в домашних роутер-проектах (OpenWrt).

Общая идея: ограничивать задержку очереди, не длину очереди. При полном насыщении канал с CAKE или fq_codel держит ping ниже ~30 мс вместо раздувания до 500 мс.

Почему это работает

Почему SQM нужно формировать ниже линейной скорости. AQM может управлять только очередью, которой владеет. Если узкое место находится внутри модема ISP, очередь вашего роутера никогда не заполняется — пакеты проходят через него и накапливаются в другом месте, где у вас нет контроля. Поэтому SQM намеренно формирует egress до ~90–95% реальной скорости аплинка. Это перемещает узкое место обратно в роутер, где fq_codel или CAKE им управляет. Вы теряете крупицу пиковой пропускной способности в обмен на очередь, которую реально можете дисциплинировать — почти всегда правильный компромисс для интерактивного домохозяйства.

Когда проблема не в буфере: BBR vs CUBIC

Управление перегрузкой также ломается на путях с большим RTT, и там ответ — другой алгоритм, а не другая очередь.

LEO-спутник (Starlink, орбита ~550 км, ~50–60 мс RTT) ведёт себя как наземный канал — потерь-ориентированный CUBIC работает нормально. GEO-спутник (~36 000 км орбита, ~600 мс RTT) — нет. При петле обратной связи 600 мс к тому времени, как сигнал о потере возвращается к отправителю, несколько полных окон уже переданы. Потерь-ориентированное управление реагирует слишком поздно; CUBIC разгоняется медленно и никогда не заполняет канал — он голодает.

BBR (Bottleneck Bandwidth and Round-trip propagation time) полностью обходит потери. Он активно зондирует пропускную способность и минимальный RTT пути, строит модель узкого места и ведёт отправки по этой модели. Поскольку он не ждёт потери, задержка обратной связи в 600 мс больше не калечит его, и BBR восстанавливает большую часть ёмкости GEO-канала. Та же независимость от потерь делает BBR сильным на любом потерявшем пути — сотовая связь, перегруженный Wi-Fi.

Эти два аспекта встречаются у сотовой вышки: мобильные операторы развёртывают AQM в стиле CAKE на радиоячейке, чтобы буфер для пользователей, делящих одну ячейку, оставался дисциплинированным. Паттерн для запоминания: BBR + AQM + маленькие буферы выигрывает на high-latency или lossy путях; CUBIC + разумно настроенный буфер нормален на наземных проводных каналах.

Викторина

Модем буферизует 300 мс данных и 'никогда не отбрасывает пакеты.' Почему это делает задержку хуже, а не лучше?

Выбери лучший вариант

В домашней сети видеозвонки прерываются при каждой загрузке резервной копии. Выберите исправление.

Проследи
1/4

Удалённый сотрудник жалуется, что видеозвонки зависают каждый день после обеда. Speed test идеален. Пройди диагностику.

1
Step 1 of 4
Шаг 1: speed test показывает 300 Мбит/с вниз / 40 Мбит/с вверх, зелёный. Что он упускает?
2
Locked
Шаг 2: idle ping до 8.8.8.8 — 18 мс. Начинаем большую загрузку и пингуем снова. Ping растёт до 420 мс. Что происходит?
3
Locked
Шаг 3: роутер поддерживает SQM. Как настроить?
4
Locked
Шаг 4: после включения CAKE снова запустить тест ping под насыщением. Что должно измениться и чем пришлось пожертвовать?

Throughput BBR на GEO-спутнике

1/3
Вспомните перед уходом
  1. 01
    Объясни bufferbloat и почему он сохраняется, несмотря на то что известен с 1980-х.
  2. 02
    Что делает Active Queue Management иначе, чем plain FIFO-буфер? Назови три AQM-алгоритма.
  3. 03
    Почему потерь-ориентированный CUBIC голодает на GEO-спутниковом канале, а BBR восстанавливает большую часть throughput?
Итог

Bufferbloat — это избыточная буферизация на сетевой границе: DOCSIS-модемы, LTE-модемы, домашние роутеры держат 100–500 мс данных в очереди. Потерям-ориентированный TCP вроде CUBIC нуждается в раннем отбрасывании пакетов для обнаружения перегрузки; огромный буфер поглощает потерю, поэтому TCP раздувает окно пока ping не раздуется с 20 мс до 300–500 мс при зелёном throughput. Сохраняется потому что вендоры гнались за «без потерь», пользователи измеряют throughput а не задержку, и исправление живёт в прошивке. Active Queue Management — fq_codel (RFC 8290), PIE (RFC 8033), CAKE — отбрасывает или маркирует рано и честно, удерживая queueing delay ниже ~30 мс даже при насыщении; SQM формирует ниже линейной скорости чтобы владеть узкой очередью. На путях с большим RTT ответ — другой алгоритм: BBR зондирует пропускную способность и RTT вместо ожидания потери, восстанавливая throughput на GEO-спутнике где CUBIC голодает.

Связанные уроки
встречается в162
Продолжить восхождение ↑Фабрика дата-центра
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources4
expand
  1. 01
  2. 02
  3. 03
  4. 04

Trademarks belong to their respective owners. Editorial reference only.