Я хотел бы моделировать задержку и потерю пакетов для UDP
и TCP
в Linux для измерения производительности приложения. Есть ли простой способ сделать это?
Имитация отложенных и отброшенных пакетов в Linux
Ответ 1
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% пакетов, и каждая последующая вероятность будет зависеть на четверть от последней.
Prob n= 0.25 × Prob n-1 + 0.75 × Random
Примечание, что вы должны использовать tc qdisc add
, если у вас нет правил для этого интерфейса или tc qdisc change
, если у вас уже есть правила для этого интерфейса. Попытка использовать tc qdisc change
на интерфейсе без правил даст ошибку RTNETLINK answers: No such file or directory
.
Ответ 2
Для отброшенных пакетов я бы просто использовал iptables и статистический модуль.
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Выше будет отброшен входящий пакет с вероятностью 1%. Будьте осторожны, все, что выше 0.14, и большинство из вас по tcp-соединениям, скорее всего, полностью остановятся.
Взгляните на man iptables и поищите "статистика" для получения дополнительной информации.
Ответ 3
Один из моих коллег использует tc для этого. Дополнительную информацию см. на странице руководства. Вы можете увидеть пример использования здесь.
Ответ 4
iptables (8) имеет модуль статистики, который может использоваться для соответствия каждому n-му пакету. Чтобы удалить этот пакет, просто добавьте -j DROP.
Ответ 5
Это руководство по моделированию сетевой физики содержит класс C++ в примере кода для моделирования задержки и потери пакетов в UDP-соединении и может быть полезным. См. общедоступные переменные latency и packetLoss класса Connection, найденные в файле Connection.h загружаемого исходного кода.
Ответ 6
Не пробовал сам, но эта страница содержит список модулей плагинов, которые запускаются в Linux, встроенной в систему фильтрации IP-адресов iptables, Один из модулей называется "nth" и позволяет вам настроить правило, которое снизит настраиваемую скорость пакетов. Возможно, это будет хорошее место, по крайней мере.
Ответ 7
Вы можете попробовать http://snad.ncsl.nist.gov/nistnet/ Это довольно старый проект NIST (последний выпуск 2005), но он работает для меня.
Ответ 8
Простой в использовании инструмент для устранения сбоев в сети - Saboteur. Он может имитировать:
- Общий сетевой раздел
- Удаленная служба (не прослушивание ожидаемого порта)
- Задержки
- Потеря пакетов -TCP (как это часто бывает, когда две системы разделены брандмауэром с состоянием)
Ответ 9
Одним из наиболее используемых инструментов в научном сообществе для этой цели является 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
Здесь более подробная информация.