Скрытый текст
Данная статья изначально не являлась самостоятельным материалом. Она должна была просто стать частью других будущих статей по производительности. Но что то пошло не так и ,кажется, почему бы ей не быть самостоятельной. Так что можете добавить ее в избранное, а уже в понедельник проверить все команды на проде :trollface:
tc netem
— инструмент Linux для эмуляции сетевых проблем. Кратко расскажу зачем он нужен, а также примеры использования.
Что такое netem
netem
(аббревиатура от Network Emulator) — это qdisc (queueing discipline) в Linux — часть подсистемы управления трафиком (tc
из iproute2
)
Его задача симулировать реальные сетевые проблемы: задержки, потери пакетов, дубликации, неправильный порядок, ограничение пропускной способности и т.д. Это важно, когда ты тестируешь, например, протоколы, приложения или сетевые устройства, и хочешь увидеть, как они поведут себя в плохой сети.
Когда и зачем использовать
Тестирование протоколов — например, TCP, QUIC, VoIP, если хочешь увидеть, как они ведут себя при потере и/или задержке.
Разработка приложений, особенно сетевых, чтобы убедиться, что сценарии «плохой сети» обрабатываются корректно.
Реалистичная нагрузка — эмуляция загруженных сетей или мобильных сетей, где часто бывают потери, задержки, «хвосты» задержек.
Обучение и демо — показать, как сеть влияет на производительность, какие паттерны возникают.
Примеры
-
Добавить фиксированную задержку
sudo tc qdisc add dev eth0 root netem delay 100ms
-
Добавить задержку + джиттер с корреляцией. Эта команда, которая эмулирует не просто «плохую» сеть, а нестабильную сеть с памятью. Гораздо ближе к реальным условиям (например, к мобильным сетям 3G/4G/5G или перегруженным каналам).
sudo tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
Давайте разберем по частям, что делает эта команда.
delay 100ms
Базовая задержка. Это средняя задержка, вокруг которой будут «колебаться» ваш и пакеты. В нашем случае это 100 миллисекунд.10ms
Джиттер (разброс задержки). Это величина, на которую задержка может случайным образом отклоняться от базовой. В данном случае задержка каждого пакета будет выбираться случайным образом из диапазона от 90ms до 110ms (100ms ± 10ms). Без корреляции это были бы просто случайные, независимые друг от друга значения.Корреляция 25%
: это параметр, который определяет, насколько задержка текущего пакета зависит от задержки предыдущего пакета. Без корреляции (0%) джиттер выглядел бы как белый шум — резкие, абсолютно случайные и независимые скачки задержки. Это не очень реалистично для многих реальных сетей. С корреляцией 25% поведение меняется: Если предыдущий пакет имел высокую задержку (например, 110 мс), то высока вероятность, что и следующий пакет тоже будет иметь задержку выше среднего. Если предыдущий пакет имел низкую задержку (90 мс), то likely и следующий будет с задержкой ниже среднего. Таким образом мы получаем некий эффект «памяти» сети. С корреляцией гораздо точнее воспроизводит поведение реальных сетей для тестирования -
Добавить нормальное распределение задержек. Большинство пакетов получают задержку, близкую к среднему значению. Крайние значения (сильные отклонения) маловероятны, но возможны. Форма кривой напоминает колокол. Данный тип использует Гауссово распределение. Существуют и другие:
uniform
,pareto
,paretonormal
.sudo tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
-
Потеря пакетов. Ну тут все просто и понятно.
sudo tc qdisc change dev eth0 root netem loss 20%
-
Дубликация пакетов. Эта команда инструктирует ядро Linux изменить текущие сетевые правила на сетевом интерфейсе eth0 таким образом, чтобы он случайным образом дублировал 1% всех исходящих сетевых пакетов. Представьте, что ваше приложение отправляет 1000 пакетов. При включенном правиле duplicate 1%: ~990 пакетов дойдут до получателя в нормальном, единственном экземпляре. ~10 пакетов будут дублированы. Получатель получит их в двух одинаковых копиях, одна сразу за другой. Полезно при тестирование устойчивости протоколов и приложений. Например, как поведет себя кодек или игровой движок.
sudo tc qdisc change dev eth0 root netem duplicate 1%
-
Ограничение пропускной способности + учёт overhead. Использование параметров overhead — это признак продвинутого и точного подхода к эмуляции. Оно позволяет ограничить скорость именно на уровне полезных данных, которую увидит приложение, что критически важно для корректного тестирования пропускной способности. Для грубого ограничения «лишь бы было медленнее» можно использовать просто rate 5mbit, но для точных измерений и реалистичной эмуляции канала связи учет overhead обязателен.
sudo tc qdisc change dev eth0 root netem rate 5mbit 20 1500 5
rate 5mbit
скорость полезной нагрузки.20
Размер заголовков канального уровня (L2).1500
размер MTU5
Размер в байтах сетевого и транспортного уровня (L3+L4) -
Удалить конфигурацию
sudo tc qdisc delete dev eth0 root netem
tc netem
— очень гибкий инструмент с богатыми возможностями для моделирования реальных сетевых условий. Если использовать его вдумчиво, с учётом ограничений, можно получить полезные, реалистичные условия для тестирования и анализа.
select26
Супер!
Очень интересно и полезно! Спасибо!
По моему, было бы полезно в статью добавить пример команды как посмотреть текущую конфигурацию tc netem.