Имитация отложенных и пропущенных пакетов в Linux

246

Я хотел бы смоделировать задержку и потерю пакетов для UDPи TCPв Linux, чтобы измерить производительность приложения. Есть ли простой способ сделать это?

Джордж Стокер
источник

Ответы:

323

Netem использует функциональные возможности, уже встроенные в Linux и утилиты пространства пользователя, для моделирования сетей. На самом деле это то, к чему относится ответ Марка под другим именем.

Примеры на их домашней странице уже показывают, как вы можете достичь того, о чем вы просили:

Примеры

Эмуляция задержек глобальной сети

Это самый простой пример, он просто добавляет фиксированную задержку ко всем пакетам, выходящим из локальной сети Ethernet.

# tc qdisc add dev eth0 root netem delay 100ms

Теперь простой тест ping для размещения в локальной сети должен показать увеличение на 100 миллисекунд. Задержка ограничена разрешающей способностью ядра (Гц). В большинстве систем 2.4 системные часы работают с частотой 100 Гц, что допускает задержки с шагом 10 мс. На 2.6 это значение параметра конфигурации от 1000 до 100 Гц.

Более поздние примеры просто изменяют параметры без перезагрузки qdisc.

Реальные глобальные сети показывают изменчивость, поэтому можно добавлять случайные отклонения.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

Это приводит к тому, что добавленная задержка составляет 100 ± 10 мс. Изменение задержки в сети не является чисто случайным, поэтому для эмуляции также существует значение корреляции.

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

Это приводит к тому, что добавленная задержка составляет 100 ± 10 мс, а следующий случайный элемент зависит от 25% от последнего. Это не истинная статистическая корреляция, а приближение.

Задержка распределения

Как правило, задержка в сети не является равномерной. Для описания изменения задержки чаще используется нечто вроде нормального распределения. Дисциплина netem может взять таблицу для указания неравномерного распределения.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

Фактические таблицы (normal, pareto, paretonormal) генерируются как часть компиляции iproute2 и помещаются в / usr / lib / tc; так что можно с некоторыми усилиями сделать свой собственный дистрибутив на основе экспериментальных данных.

Потеря пакета

Случайная потеря пакета указывается в команде 'tc' в процентах. Наименьшее возможное ненулевое значение:

2 −32 = 0,0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

Это приводит к случайному выбрасыванию 1/10 процента (т.е. 1 из 1000) пакетов.

Необязательная корреляция также может быть добавлена. Это делает генератор случайных чисел менее случайным и может использоваться для эмуляции потерь пакета.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

Это приведет к потере 0,3% пакетов, и каждая последующая вероятность зависит на четверть от последней.

Проб n = 0,25 × Проб н-1 + 0,75 × Случайный

Обратите внимание, что вы должны использовать, tc qdisc addесли у вас нет правил для этого интерфейса или tc qdisc changeесли у вас уже есть правила для этого интерфейса. Попытка использовать tc qdisc changeинтерфейс без правил приведет к ошибке RTNETLINK answers: No such file or directory.

ephemient
источник
2
На оригинальном сайте есть эта ошибка, я просто скопировал этот текст напрямую. Но да, 2 ^ (- 32) = 2,33e-10
эпифим
34
Обратите внимание, что tc -p qdisc ls dev eth0будут перечислены текущие определенные правила и tc qdisc del dev eth0 rootбудут удалены
Quamis
1
проголосовал за указание на ошибку при попытке изменить несуществующую запись
Neo
Вы знаете, почему я получаю эти ошибки? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / РЕЗУЛЬТАТЫ $ sudo tc qdisc добавить dev eth0 задержка корня netem 100ms RTNETLINK ответы: файл существует ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / РЕЗУЛЬТАТЫ $ sudo tc qdisc change dev eth0 корневая задержка netem 100 мс RTNETLINK отвечает: неверный
Мона Джалал
Вероятно, было бы неплохо включить подробности о том, как ограничить пропускную способность всех интерфейсов для имитации низкоскоростных каналов
Павел П
91

Для отброшенных пакетов я бы просто использовал iptables и модуль статистики .

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

Выше будет отброшен входящий пакет с вероятностью 1%. Будьте осторожны, все, что выше 0.14, и большинство из вас tcp-соединений, скорее всего, полностью остановится.

Взгляните на man iptables и поищите «статистика» для получения дополнительной информации.

Бьярке Фрейнд-Хансен
источник
6
Почему TCP-соединения зависают при значениях выше 14%?
Дэвид Волевер
2
@DavidWolever: из-за способа настройки размера раздвижных окон tcp. Но 14% - исключительно из опыта, попробуйте сами, и вы увидите, что ssh становится в основном непригодным для использования при 14% и выше, но на самом деле работает довольно хорошо при более низких уровнях скорости отбрасывания пакетов.
Бьярке Фрейнд-Хансен
12
В целях безопасности, вероятно, лучше ограничить правило, применимое только к тем портам, которые вы хотите проверить: iptables -A INPUT --dport FOO -m statistics .... Таким образом, ваши ssh и другие соединения будут оставайтесь безмятежными, и вы можете снизить частоту выпадения для интересующего сервиса, чтобы иметь возможность быстрее воспроизвести любые проблемы с ним.
Михаил Т.
5
Обратите внимание, что DROPна исходящих соединениях довольно нелепо вызывает send()возврат операций EPERM, а не просто отбрасывание пакетов (как и должно быть).
Фальшивое имя
2
Это все, что нужно, чтобы отменить эту команду? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314
6

Один из моих коллег использует для этого tc. Обратитесь к странице справки для получения дополнительной информации. Вы можете увидеть пример его использования здесь .

отметка
источник
Я думаю, что проще использовать iptables :)
c4f4t0r
конечно, но tc намного быстрее, чем iptables
teknoraver
5

В iptables (8) есть модуль статистического сопоставления, который можно использовать для сопоставления каждого n-го пакета. Чтобы отбросить этот пакет, просто добавьте -j DROP .

hillu
источник
3

Это руководство по моделированию сетевой физики содержит класс C ++ в примере кода для моделирования задержки и потери пакетов в UDP-соединении и может быть полезным. См. Общедоступные переменные latency и packetLoss класса Connection, найденные в файле Connection.h загружаемого исходного кода .

Судья майгарден
источник
1

Сам не пробовал, но на этой странице есть список подключаемых модулей, которые работают в Linux, встроенной в систему IP-фильтрации iptables. Один из модулей называется «nth» и позволяет вам установить правило, которое будет сбрасывать настраиваемую скорость пакетов. Может быть, это хорошее место для начала, по крайней мере.

размотать
источник
1

Простой в использовании инструмент для инъекции сбоев в сети - Saboteur . Может имитировать:

  • Общий сетевой раздел
  • Удаленный сервис отключен (не прослушивает ожидаемый порт)
  • Задержки
  • Потеря пакета - Тайм-аут соединения TCP (как часто случается, когда две системы разделены межсетевым экраном с контролем состояния)
Алекс Джотис
источник
1
К сожалению, последний коммит в этом проекте был 28 августа 2015 года, то есть почти 4 года назад. Открытым номерам уже 5 лет.
Али
1

Одним из наиболее используемых инструментов в научном сообществе для этой цели является DummyNet . После того, как вы установили ipfwмодуль ядра, чтобы ввести задержку распространения 50 мс между двумя машинами, просто выполните следующие команды:

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

Чтобы также внести 50% потерь пакетов, вы должны выполнить:

./ipfw pipe 1 config plr 0.5

Здесь больше подробностей.

Гаэтано
источник