Я хотел бы смоделировать задержку и потерю пакетов для UDP
и TCP
в Linux, чтобы измерить производительность приложения. Есть ли простой способ сделать это?
Я хотел бы смоделировать задержку и потерю пакетов для UDP
и TCP
в Linux, чтобы измерить производительность приложения. Есть ли простой способ сделать это?
Ответы:
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
.
tc -p qdisc ls dev eth0
будут перечислены текущие определенные правила и tc qdisc del dev eth0 root
будут удалены
Для отброшенных пакетов я бы просто использовал iptables и модуль статистики .
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Выше будет отброшен входящий пакет с вероятностью 1%. Будьте осторожны, все, что выше 0.14, и большинство из вас tcp-соединений, скорее всего, полностью остановится.
Взгляните на man iptables и поищите «статистика» для получения дополнительной информации.
DROP
на исходящих соединениях довольно нелепо вызывает send()
возврат операций EPERM
, а не просто отбрасывание пакетов (как и должно быть).
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
Один из моих коллег использует для этого tc. Обратитесь к странице справки для получения дополнительной информации. Вы можете увидеть пример его использования здесь .
Это руководство по моделированию сетевой физики содержит класс C ++ в примере кода для моделирования задержки и потери пакетов в UDP-соединении и может быть полезным. См. Общедоступные переменные latency и packetLoss класса Connection, найденные в файле Connection.h загружаемого исходного кода .
Сам не пробовал, но на этой странице есть список подключаемых модулей, которые работают в Linux, встроенной в систему IP-фильтрации iptables. Один из модулей называется «nth» и позволяет вам установить правило, которое будет сбрасывать настраиваемую скорость пакетов. Может быть, это хорошее место для начала, по крайней мере.
Вы можете попробовать http://snad.ncsl.nist.gov/nistnet/ Это довольно старый проект NIST (последний выпуск 2005), но он работает для меня.
Простой в использовании инструмент для инъекции сбоев в сети - Saboteur . Может имитировать:
- Общий сетевой раздел
- Удаленный сервис отключен (не прослушивает ожидаемый порт)
- Задержки
- Потеря пакета - Тайм-аут соединения TCP (как часто случается, когда две системы разделены межсетевым экраном с контролем состояния)
Одним из наиболее используемых инструментов в научном сообществе для этой цели является 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
Здесь больше подробностей.