Mininet. Token Bucket Filter

Управление пропускной способностью с помощью дисциплина очередей Token Bucket Filter (TBF).

1 Общая информация

1.1 Цели

  • Освоить использование дисциплины очередей Token Bucket Filter (TBF).

1.2 Задачи

  • Получить понятие об алгоритме Token Bucket.
  • Использовать Token Bucket Filter (tbf) в Linux.
  • Понять, как комбинировать дисциплины очередей в Linux Traffic Control (tc).
  • Объединить tbf и NETEM.
  • Эмулируйте свойства WAN в Mininet.

1.3 Видео: Token Bucket Filter. Введение

2 Теоретические сведения

2.1 Введение в алгоритм Token Bucket

  • При моделировании глобальной сети (WAN) иногда необходимо ограничить пропускную способность устройств (конечных хостов и сетевых устройств), чтобы наблюдать за поведением сети в различных условиях.
  • Token Bucket — это алгоритм, используемый в сетях с коммутацией пакетов для ограничения пропускной способности и пиковой нагрузки трафика.
  • Сущность Token Bucket состоит в добавлении токенов (представленных в виде пакетов или байтов) с фиксированной скоростью в буфер (ведро) с фиксированной ёмкостью.
  • Когда приходит новый пакет длиной \(n\) байт, буфер (ведро) проверяется на количество доступных токенов; если доступно хотя бы \(n\) токенов, \(n\) токенов удаляются из ведра, и пакет отправляется в сеть.
  • В противном случае токены не удаляются, и пакет считается несоответствующим. В таком случае пакет может быть отброшен, поставлен в очередь или передан, но помечен как несоответствующий.
  • Параметры алгоритма:
    • rate есть скорость передачи; она определяется частотой, с которой токены добавляются в корзину.
    • Burstiness (всплеск): когда ведро полностью занято (т. е. никакие пакеты не потребляют токены), новые пакеты будут потреблять токены сразу, без ограничений. Всплеск определяется как количество токенов, которые могут поместиться в ведро (или размер ведра).
    • Иногда создаётся ещё одно маленькое ведро, с размером, равным максимально передаваемому элементу (Maximum Transmission Unit — MTU). Скорость обработки этого буфера намного превышает исходную (peak rate — пиковая скорость).

2.2 Основной синтаксис tbf

  • Основной синтаксис tbf, используемый с tc, следующий:
    tc qdisc [add | ...] dev [dev_id] root tbf limit [BYTES] burst [BYTES] rate [BPS] [mtu BYTES] [ peakrate BPS ] [ latency TIME ]
    
  • Здесь:
    • tc : инструмент управления трафиком Linux;
    • qdisc : дисциплина очереди (qdisc) представляет собой набор правил, определяющих порядок, в котором обслуживаются пакеты, поступающие с выходных данных IP-протокола. Дисциплина очереди применяется к очереди пакетов, чтобы решить, когда отправлять каждый пакет;
    • [add | del | replace | change | show] : операция над qdisc;
    • dev [dev_id]: задаёт интерфейс;
    • tbf : указывает, что используется алгоритм Token Bucket Filter;
    • limit [BYTES] : размер очереди пакетов в байтах;
    • burst [BYTES] : количество байтов, которое может поместиться в корзину;
    • rate [BPS]: скорость передачи, определяемая частотой, с которой токены добавляются в корзину;
    • mtu [BYTES] : максимальная единица передачи в байтах;
    • peakrate [BPS] (пиковая скорость [бит/с]): максимальная скорость пакета;
    • latency [TIME] : максимальное время ожидания пакета в очереди.

3 Подготовка стенда

3.1 Лабораторная топология

  • В топологии используется сеть 10.0.0.0/8, назначенная Mininet по умолчанию.

  • Топология представляет собой коммутатор с двумя подключёнными к нему хостами.

  • Для запуска топологии (рис. 1) используем параметры командной строки:

    sudo mn --topo=linear,2 -x
    

    h110.0.0.1h210.0.0.2s1s2h1-eth0s1-eth110 Gbpss1-eth2s2-eth2s2-eth1h2-eth0

    Рис. 1.: Лабораторная топология

3.2 Рабочие файлы

  • Подключимся к виртуальной машине:
    ssh -Y mininet@192.168.x.y
    
  • Для рабочих файлов будем использовать каталог ~/work/lab_tbf:
    mkdir -p ~/work/lab_tbf
    

4 Интерактивный эксперимент

4.1 Отсутствие ограничения скорости

  • Запустим iPerf3 в режиме сервера, выполните команду iperf3 -s в терминале хоста h2:
    iperf3 -s
    
  • Запустим iPerf3 в клиентском режиме, запустите команду iperf3 -c 10.0.0.2 для хоста h1:
    iperf3 -c 10.0.0.2
    
  • Чтобы остановить сервер, нажмите Ctrl+c в терминале хоста h2.

4.2 Ограничение скорости на конечных хостах

  • Команду tc можно применить к сетевому интерфейсу устройства для формирования исходящего трафика.
  • Будем ограничивать скорость отправки конечного хоста с помощью фильтра Token Bucket Filter (tbf), который является реализацией алгоритма Token Bucket.

4.2.1 Определим интерфейс хостов h1 и h2

  • На хосте h1 введите команду ifconfig, чтобы отобразить информацию, относящуюся к его сетевым интерфейсам и назначенным им IP-адресам.
    • Хост h1 имеет два интерфейса: h1-eth0 и lo. Интерфейс h1-eth0 на хосте h1 настроен с IP-адресом 10.0.0.1 и маской подсети 255.0.0.0. Этот интерфейс необходимо использовать в tc при эмуляции сети.
  • В командной строке хоста h2 также введите команду ifconfig.
    • Хост h2 имеет два интерфейса: h2-eth0 и lo. Интерфейс h2-eth0 на хосте h1 настроен с IP-адресом 10.0.0.2 и маской подсети 255.0.0.0. Этот интерфейс необходимо использовать в tc при эмуляции сети.

4.2.2 Эмуляция глобальной сети 10 Гбит/с с высокой задержкой

  • Будем использовать команду tbf на сетевом интерфейсе для управления скоростью исходящего трафика.
  • Измените пропускную способность хоста h1:
    sudo tc qdisc add dev h1-eth0 root tbf rate 10gbit burst 5000000 limit 15000000
    
  • Эта команда устанавливает пропускную способность на 10 Гбит/с на интерфейсе h1-eth0 хоста h1.
  • Параметры Token Bucket Filter:
    • rate : 10gbit;
    • burst : 5,000,000;
    • limit : 15,000,000.
  • Распишем элементы команды:
    • sudo : включить выполнение команды с более высокими привилегиями безопасности;
    • tc : вызвать управление трафиком Linux;
    • qdisc : изменить дисциплину очередей сетевого планировщика;
    • add (добавить): создать новое правило;
    • dev h1-eth0 root : интерфейс, на котором будет применяться правило;
    • tbf : использовать алгоритм Token Bucket Filter;
    • rate : укажите скорость передачи (10 Гбит/с);
    • burst : количество байтов, которое может поместиться в корзину (5 000 000) за один такт;
    • limit : размер очереди в байтах (15 000 000).
  • Расчёт всплеска.
    • tbf требует установки значения всплеска при ограничении скорости. Это значение должно быть достаточно высоким, чтобы обеспечить установленную вами скорость.
    • Она должна быть не ниже указанной частоты, делённой на HZ, где HZ — тактовая частота, настроенная как параметр ядра, и может быть извлечена с помощью следующей команды:
      egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
      
    • HZ на h1 — 250. Таким образом, для расчёта всплеска делим 10 Гбит/с на 250:
      • 10 Gbps = 10,000,000,000 bps;
      • burst = 10,000,000,000 [bps]/250 [s-1] = 40,000,000 [bit] = 40,000,000/8 [byte] = 5,000,000 [byte].
    • Полученное значение должно использоваться в команде в качестве значения burst (всплеска).
  • Проверим конфигурацию с помощью инструмента iperf3 для измерения пропускной способности.
  • Запустим iPerf3 в режиме сервера, выполните команду iperf3 -s в терминале хоста h2:
    iperf3 -s
    
  • Запустим iPerf3 в клиентском режиме, запустите команду iperf3 -c 10.0.0.2 для хоста h1:
    iperf3 -c 10.0.0.2
    
  • Чтобы остановить сервер, нажмите Ctrl+c в терминале хоста h2.
  • Удалите конфигурацию на хосте h1:
    sudo tc qdisc del dev h1-eth0 root
    

4.3 Ограничение скорости на коммутаторах

  • Применим Token Bucket Filter к интерфейсам коммутатора.

  • При ограничении скорости на интерфейсе s1-eth2 коммутатора s1 все сеансы связи между коммутатором s1 и коммутатором s2 будут фильтроваться в соответствии с применяемыми правилами.

  • Введите в терминале s1 команду ifconfig, чтобы отобразить информацию, связанную с его сетевыми интерфейсами:

    • s1-eth1 : интерфейс, соединяющий коммутатор s1 с хостом h1;
    • s1-eth2 : интерфейс, соединяющий коммутатор s1 с коммутатором s2;
    • s2-eth1 : интерфейс, соединяющий коммутатор s2 с хостом h2;
    • s2-eth2 : интерфейс, соединяющий коммутатор s2 с коммутатором s1.
  • Примените правило ограничения скорости tbf к интерфейсу коммутатора s1, который соединяет его с коммутатором s2 (s1-eth2):

    sudo tc qdisc add dev s1-eth2 root tbf rate 10gbit burst 5000000 limit 15000000
    
    • Параметры Token Bucket Filter следующие:
      • rate : 10gbit;
      • burst : 5,000,000;
      • limit : 15,000,000.
  • Проверим конфигурацию с помощью инструмента iperf3 для измерения пропускной способности.

  • Запустим iPerf3 в режиме сервера, выполните команду iperf3 -s в терминале хоста h2:

    iperf3 -s
    
  • Запустим iPerf3 в клиентском режиме, запустите команду iperf3 -c 10.0.0.2 для хоста h1:

    iperf3 -c 10.0.0.2
    
  • Чтобы остановить сервер, нажмите Ctrl+c в терминале хоста h2.

  • Удалите конфигурацию на коммутаторе s1:

    sudo tc qdisc del dev s1-eth2 root
    

4.4 Объединение NETEM и TBF

  • NETEM используется для введения задержки, джиттера, повреждения пакетов и т. д.

  • TBF может использоваться для ограничения скорости.

  • Возможно комбинировать несколько модулей.

  • Первый qdisc (qdisc1) присоединён к корневой метке. Затем последующие qdisc можно прикрепить к своим родителям, указав правильную метку.

  • Объединим NETEM и TBF, чтобы сделать эмуляцию адекватней. Введём задержку, джиттер и повреждение пакетов, указав скорость на интерфейсе коммутатора s1.

  • Введём в терминале коммутатора s1:

    sudo tc qdisc add dev s1-eth2 root handle 1: netem delay 10ms
    
    • Ключевое слово handle задаёт дескриптор подключения, имеющий смысл очерёдности подключения разных дисциплин qdisc.
  • Теперь можно убедиться, что соединение от хоста h1 к хосту h2 имеет заданную задержку.

  • Запустите команду ping с терминала хоста h1:

    ping 10.0.0.2
    
  • Нажмите Ctrl+c, чтобы остановить тест.

  • Добавим второе правило на коммутаторе s1, которое задаёт ограничение скорости с помощью tbf:

    sudo tc qdisc add dev s1-eth2 parent 1: handle 2: tbf rate 2gbit burst 1000000 limit 2000000
    
    • Параметры Token Bucket Filter следующие:
      • rate : 2gbit;
      • burst : 1,000,000;
      • limit : 2,000,000.
  • Проверим предыдущую конфигурацию с помощью инструмента iperf3 для измерения пропускной способности.

  • Запустим iPerf3 в режиме сервера, выполните команду iperf3 -s в терминале хоста h2:

    iperf3 -s
    
  • Запустим iPerf3 в клиентском режиме, запустите команду iperf3 -c 10.0.0.2 для хоста h1:

    iperf3 -c 10.0.0.2
    
  • Чтобы остановить сервер, нажмите Ctrl+c в терминале хоста h2.

  • Удалите конфигурацию на коммутаторе s1:

    sudo tc qdisc del dev s1-eth2 root
    

4.5 Видео: Token Bucket Filter. Интерактивный эксперимент

Предыдущий