Ключевые слова:network, linux, emulation, ttl, bridge, (найти похожие документы)
From: m0sia <m0sia@plotinka.ru.>
Date: Mon, 7 Nov 2010 17:02:14 +0000 (UTC)
Subject: Эмуляция влияния задержек глобальных сетей в Linux
Оригинал: http://m0sia.ru/node/67
Часто возникает задача исследовать влияние задержек, потерь и джиттера
на работу сетевого приложения. Подобная задача стоит в первую очередь
перед специалистами, которые занимаются разработкой или внедрением
решений VoIP, сетевых игр, потокового медиа контентента. С большим
распространением беспроводных сетей передачи данных, таких как GPRS,
CDMA, спутниковых систем связи, исследования влияния параметров сетей
передачи данных на работу приложений становятся особенно важными.
Рассмотрим схему, с помощью которой можно смоделировать влияние
различных параметров сети передачи данных на исследуемое приложение.
Для моделирование очень удобно использовать операционную систему
GNU/Linux, в которой существуют все необходимые инструменты. В ядро ОС
linux входит модуль netem, который предоставляет функционал для
эмуляции WAN. Текущая версия модуля имеет следующие функции:
* эмуляция задержки, с различной функцией распределения
* эмуляция потерь
* эмуляция повтора пакетов
* эмуляция перемешивания пакетов
* эмуляция искажения пакетов
Этот модуль включен по умолчанию в большинство современных
дистрибутивов, основанных на ядре операционной системы Linux
2.6(Fedora, OpenSuse, Gentoo, Debian, Mandriva, Ubuntu) и управляется
при помощи команды tc из пакета iproute2. Если ваш дистрибутив не
включает в себя этот модуль, то его можно включить самостоятельно:
Networking -->
Networking Options -->
QoS and/or fair queuing -->
Network emulator
Для изучения влияния параметров транспортной сети на приложение, проще
всего использовать выделенный компьютер, который работает по схеме
изображенной на рис. 1. На выделенном компьютере порты объедены в
мост(ethernet bridge), что позволяет прозрачно перебрасывать пакеты с
одного интерфейса на другой и выполнять роль коммутатора. Такое
решение является оптимальным, тк теперь мы можем фильтровать трафик,а
также изменять требуемые параметры транспортного потока.
Для того, чтобы настроить мост, в системе должен быть установлен пакет
bridge-utils. Для создания предложенной конфигурации нужно создать
мост:
#brctl add br0
Добавить к нему нужные интерфейсы:
#brctl addif br0 eth0
#brctl addif br0 eth1
Настроить адрес на интерфейсе br0 для доступа к компьютеру по сети:
#ifconfig br0
После этого ethernet фреймы приходящие в один интерфейс, будут
пересылаться в другой. Стоит отметить, что пересылаемые пакеты
проходят через netfilter, таким образом фильтрацией трафика можно
управлять по средствам iptables на сетевом уровне и ebtables на
канальном уровне модели OSI.
Эмуляция задержки пакетов
Самым простым примером добавлением корневого qdisc, эмулирующего
задержку.
# tc qdisc add dev eth1 root netem delay 800ms
Стоит запомнить, что мы можем контролировать только исходящий траффик,
поэтому данная команда в нашей схеме установит задержку данных,
которые идут в направлении от сервер-клиент, равной 800мс. Чтобы
сделать наш сценарий более реалистичным можно, добавить стандартной
отклонение. В дальнейшем мы будем изменять корневой qdisc.
# tc qdisc change dev eth0 root netem delay 800ms 100ms
Теперь задержка будет изменяться с отклонением 100мс.
В модуле netem существует возможность задавать неравномерное
распределение задержки. Например, чтобы задать нормальную функцию
распределения, нужно сделать следующие:
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
Другие таблицы распределения(normal, pareto, paretonormal)
устанавливаются вместе с iproute2 в каталог /usr/lib/tc. Не составит
большого труда сгенерировать свою таблицу распределения, отражающую
задержки канала связи, основанную на экспериментальных данных.
Эмуляция изменений потока пакетов
Случайная потеря пакетов задается в процентах.
# tc qdisc change dev eth0 root netem loss 0.1%
Это приведет к потере 1 из 1000 пакетов. В качестве опции можно
добавить корреляцию потери пакетов. Это приведет к тому, что генератор
случайных чисел будет <<менее случайно>> . Это можно использовать с
целью эмулировать packet burst.
# tc qdisc change dev eth0 root netem loss 0.5% 25%
В этом примере будет теряться 0.5% пакетов, при чем вероятность потери
пакета вырастает на четверть, если предыдущий был потерян.
Дублирование пакетов задается таким же образом, как и потеря.
# tc qdisc change dev eth0 root netem duplicate 1%
В новых ядрах(2.6.16 и старше) возможно добавления белого шума в
пакеты. Такая возможность задается также как и потеря пакетов:
# tc qdisc change dev eth0 root netem corrupt 0.1%
Другая ситуация, случающаяся в сетях с задержками это перемешивание
пакетов, когда отправленный ранее пакет приходит позже пакета
отправленного после него. В модуле netem существует две методики
перемешивания. Самым простым является метод gap. Этод метод
перемешивает каждый N-ый пакет.
# tc qdisc change dev eth0 root netem gap 5 delay 10ms
В данном примере каждый 5-й пакет будет отправлен немедленно, тогда
как остальные будут задержаны на 10мс. Это приведет к тому, что пакеты
придут в порядке отличном от того, как они были посланы. Такое
поведение полезно при простой отладке транспортного протокола.
Следующий метод reoder гораздо больше приближен к реальной жизни. С
помощью него можно указывать какой процент пакетов можно перемешать.
# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
В данном примере 25% пакетов( с корреляцией 50%) будут посланы
немедленно, тогда как остальные будут задержаны на 10мс.
Третий возможный вариант перемешивания.
# tc qdisc change dev eth0 root netem delay 100ms 75ms
Если один пакет получит задержку 100мс, а следующий пакет посланный
1мс позже получит задержку 50мс(100мс -- 50мс джиттер), то второй
пакет будет послан раньше.
Стоит отметить, что для реализации любого из методов нужно
использовать задержку.
Модуль netem является дисциплиной управления трафиком, поэтому его
можно использовать в связках с другими дисциплинами, такими как
TBF,CBQ и пр. Также можно строить цепочки дисциплин и применять к ним
различные фильтры.
# tc qdisc add dev eth0 root handle 1: prio
# tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 200ms 10ms distribution normal
# tc qdisc add dev eth0 parent 30:1 tbf rate 20kbit buffer 1600 limit 3000
# tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dst 65.172.181.4/32 flowid 1:3
В этом примере мы создаем корневую дисциплину приоритетов,
присоединяем к третьему приоритету дисциплину netem, а потом добавляем
шейпинг скорости.
Как мы видим, инструментальные средства ОС Linux позволяют нам
произвести моделирование любых аномалий, которые могут произойти в
сети. Таким образом, любой системный администратор может произвести
необходимое тестирование при разворачивании распределенных сервисов и
внедрения новых протоколов.
Используемый источник http://www.linux-foundation.org/en/Net:Netem