Имитация отложенных и пропущенных пакетов в Linux - PullRequest
227 голосов
/ 05 марта 2009

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

Ответы [ 9 ]

301 голосов
/ 05 марта 2009

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 × Проба n-1 + 0,75 × Случайная

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

80 голосов
/ 06 июля 2009

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

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

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

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

7 голосов
/ 05 марта 2009

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

5 голосов
/ 05 марта 2009

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

3 голосов
/ 05 марта 2009

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

1 голос
/ 11 апреля 2016

Одним из наиболее часто используемых в научном сообществе инструментов для этой цели является 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

Здесь подробнее.

1 голос
/ 11 апреля 2016

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

  • Общий сетевой раздел
  • Удаленная служба недоступна (не прослушивает ожидаемый порт)
  • Задержка
  • Потеря пакета -TCP тайм-аут соединения (как часто бывает, когда две системы разделены брандмауэром с состоянием)
1 голос
/ 23 октября 2009

Вы можете попробовать http://snad.ncsl.nist.gov/nistnet/ Это довольно старый проект NIST (последний выпуск 2005 года), но он работает для меня.

1 голос
/ 05 марта 2009

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

...