Эмулирование задержек и потерь пакетов с помощью dummynet

При тестировании программного обеспечения иногда нужно понять, как оно поведет себя в сетях 3G/4G. Нас интересует влияние полосы пропускания, задержек, потери пакетов. При этом использоваться будет обычная локальная сеть.

Рассмотрим использование dummynet для этой задачи.

Скачать исходники можно тут ссылка После этого надо собрать по инструкциям из README.

Далее считаем, что сборка прошла успешно и компонент установлен (insmod ./dummynet2/ipfw_mod.ko в линуксе).

Настроим некоторые правила.

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

В примере будем использовать 2 канала (pipe). В принципе можно задать и больше. Один канал с номером 10 для входящего трафика и другой с номером 20 для исходящего.

1. Создание каналов. Заметим, что мы не хотим проводить через dummynet вообще весь трафик, мы будем применять фильтры по OS () IP:

ipfw add pipe 10 ip from <OS_IP> to any in
ipfw add pipe 20 ip from any to <OS_IP> out

— этими командами мы перенаправили весь трафик с OS_IP (поставьте вместо него нужный IP) в канал in и весь трафик к OS_IP через канал out.

Судя по документации можно задавать диапазон IP, я это не использовал.

Важно. При задании ограничения на полосы пропускания каналов upload and download значительно возрастает потеря пакетов. В связи с этим не рекомендуется использовать канал OUT, шаги для нее можно пропустить.

При более реалистичных сценариях тестирования фильтрация по OS_IP может быть малополезной, и пригодится вариант фильтра по портам:

ipfw add pipe 10 src-port 80,443 in
ipfw add pipe 20 dst-port 80,443 out

Не создавайте каналов вида:

ipfw add pipe 10 ip from any to any in

— это прибьет сеть на той машине, где команда запущена.

Созданные каналы можно проверить следующим образом:

ipfw show
00100 0 0 pipe 10 ip from any to any src-port 80,443 in
00200 0 0 pipe 20 ip from any to any dst-port 80,443 out

2. Теперь ограничим скорости:

ipfw pipe 10 config plr 0.02 delay 50 bw 5000Kbit/s
ipfw pipe 20 config plr 0.01 delay 70 bw 2000Kbit/s

«plr 0.02» означает потерю пакетов 2%
«delay 50» — задержка 50 мс

При таких настройках имеем:
общая потеря пакетов 3%
общая задержка 120 мс
скорость соединения зависит от направления передачи данных: 5000 Kbit/s для скачивания и 2000 Kbit/s для закачивания

Можно проверить свои настройки:

ipfw pipe show
00010: 5.000 Mbit/s 50 ms burst 0
q131082 50 sl.plr 0.020000 0 flows (1 buckets) sched 65546 weight 0 lmax 0 pri 0 droptail
sched 65546 type FIFO flags 0x0 0 buckets 0 active
00020: 2.000 Mbit/s 70 ms burst 0
q131092 50 sl.plr 0.010000 0 flows (1 buckets) sched 65556 weight 0 lmax 0 pri 0 droptail
sched 65556 type FIFO flags 0x0 0 buckets 0 active

3. Эмулируем флуктуацию (разброс, колебания) задержек (PDV — packet delay variation)

Средствами самого dummynet сделать это не получится, нужен скрипт, который периодически меняет задержку. Пример: ссылка на скрипт

4. Тестирование сетевых характеристик

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

Характеристики plr, delay, pdv могут быть проверены командой ping.

Скорость можно проверить с помощью curl. При этом лучше не задавать настройки задержки, потери пакетов и pdv, т. к. это влияет на измерения.

Альтернативный продукт: netem


You can leave a response, or trackback from your own site.

Leave a Reply