Эмуляция влияния глобальных сетей

    В данный блог обычно пишут статьи, где Linux представляется user-friendly, ниже приведенный текст скорее относится к разделу «Linux не для всех» и будет интересен гораздо более узкому кругу хабрачитателей.

    Часто возникает задача исследовать влияние задержек, потерь и джиттера на работу сетевого приложения. Подобная задача стоит в первую очередь перед специалистами, которые занимаются разработкой или внедрением решений 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

    Кросспост из моего блога: m0sia.ru/node/67

    Если вы укажете на мои ошибки, буду благодарен.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 4

      0
      Замечательно. Спасибо.
        0
        действительно интересные возможности, спасибо за статью
          +1
          Спасибо. В общем-то все нашел самостоятельно, но статья полезная. Если собираетесь ее еще где-нибудь выкладывать и интересуют предложения, то увеличте вступление, мне кажется, что несколько не хватает описания кому и зачем все это нужно.
            0
            побольше бы по сетям )
            спасибо!

            Only users with full accounts can post comments. Log in, please.