---- 0-TH SEC: ----
<--------------------------| | | |<-------------------CUBIC
| | 500ms | |
CUBIC--------------------->| | ^^^^^5ms | |------------------------>
| | 10ms| | | |
| |---120Mbps,20ms--| |
| | | |
| | 15-TH SEC: | |
VEGAS---120Mbps,2000pkts-->| | | |--120Mbps,5ms,3000pkts-->
| | | |
VEGAS---120Mbps,2000pkts-->| | | |--120Mbps,5ms,3000pkts-->
---- 30 SECS ----
CoCo-Beholder — это удобный для человека эмулятор виртуальной сети, обеспечивающий популярную топологию «гантели» любого размера. Каждое соединение топологии может иметь индивидуальную скорость, задержку и размер очереди. Центральный канал также может иметь переменную задержку с необязательным джиттером. Потоки разных схем могут работать вместе в топологии в течение определенного времени выполнения в секундах. Для каждого потока можно выбрать его направление и начальную секунду времени выполнения.
Каждый поток имеет хост в левой половине и хост в правой половине топологии, и хосты обмениваются трафиком схемы, причем один хост является отправителем, а другой — получателем. Существует левый маршрутизатор, который соединяет все хосты в левой половине топологии, и правый маршрутизатор, который соединяет все хосты в правой половине топологии. Все потоки используют общий центральный канал между двумя маршрутизаторами.
Тестирование
Анализ
Графики и генерация статистики
Установка
Устранение неполадок в схеме
Добавление новой схемы
Поддержка Python
Сторонние библиотеки
Авторство
Контакт
Эта команда указывает путь к коллекции, содержащей тестируемые схемы, и запускает тестирование в течение 30 секунд, при этом центральный канал имеет скорость 120 Мбит/с и переменную задержку (базовая задержка 20 мс, дельта 500 мс, шаг 10 мс, джиттер 5). РС):
./run.py -p ~ /pantheon 20ms 0.5s 10ms 5ms -t 30 -r 120 -s 12345
Если это первый запуск скрипта, генерируется и используется файл макета по умолчанию layout.yml
, показанный ниже. Полученная в результате установка тестирования представлена на рисунке топологии «гантели» вверху этой страницы. Файл макета можно редактировать, чтобы получить гораздо более сложные настройки тестирования с большим количеством потоков, принадлежащих различным схемам и имеющих различные сетевые настройки.
# Delays/rates are optional: if lacking or null, they are set to 0us/0.0
# and for netem, to set delay/rate to zero is same as to leave it unset.
# Sizes of queues are optional: if lacking or null, they are set to 1000.
- direction : <-
flows : 1
left-delay : null
left-queues : null
left-rate : null
right-delay : null
right-queues : null
right-rate : null
scheme : cubic
start : 0
- direction : ->
flows : 2
left-delay : 0us
left-queues : 2000
left-rate : 120.0
right-delay : 5ms
right-queues : 3000
right-rate : 120
scheme : vegas
start : 15
- direction : ->
flows : 1
scheme : cubic
start : 0
Скорость, задержка и размер очереди всегда устанавливаются на обоих интерфейсах на концах каждого канала в топологии с помощью эмулятора канала tc
qdisc NetEm. В частности, это означает, что RTT канала в два раза превышает (одностороннюю) задержку. Только центральный канал может иметь на своих концах два разных размера очереди интерфейсов – см. аргументы -q1
, -q2
, -q
в справочном сообщении скрипта. По умолчанию обе очереди содержат по 1000 пакетов.
Переменная задержка в центральном канале определяется четырьмя позиционными аргументами: базовой задержкой, дельтой, шагом и джиттером, где джиттер можно пропустить. Каждое дельта-время задержка увеличивается или уменьшается шаг за шагом в зависимости от генератора псевдослучайных чисел, начальное значение которого может быть указано с аргументом -s
или ему присвоено текущее время UNIX. Чтобы иметь постоянную задержку на центральном канале, выберите дельта >= время выполнения -t
.
В выбранный выходной каталог записывается файл metadata.json
, содержащий все параметры теста, включая начальное число генератора. В будущем файл может быть передан в CoCo-Beholder для полного воспроизведения теста. Также в ходе тестирования файлы дампов PCAP записываются на всех хостах топологии «гантель» в выходной каталог с помощью tcpdump
. Итак, для примера на рисунке было записано восемь файлов дампа PCAP.
Примечание №1: Максимальную задержку для каждого канала – бокового и центрального (дрожание не учитывается) – можно указать с помощью опции -m
. Чтобы иметь прямоугольную задержку на центральном канале, установите максимальную задержку равной сумме базовой задержки и шага.
Примечание № 2: Сценарий тестирования вызывает setup_after_reboot
в оболочке Pantheon каждой схемы в файле макета перед запуском любых потоков схем, поэтому пользователю не нужно вручную настраивать схемы после каждой перезагрузки.
Скрипт анализа принимает только два аргумента: входную папку и выходную папку — по умолчанию dumps
и graphs/data
.
Сначала скрипт просто копирует файл метаданных из входной папки в выходную. Затем сценарий обрабатывает пару дампов PCAP <flow's starting #>-<scheme>-<sender/receiver>.pcap
каждого потока и извлекает информацию о пакетах потока в отдельный файл журнала данных json потока. Например, для двух дампов размером ~12 ГБ создается один файл журнала данных размером ~300 МБ.
Частичный вывод скрипта анализа для примера на рисунке:
./analyze.py
cubic scheme, flow 1:
sender dump: 100.0% in 5.18s
Total: 222667 pkts/224631734 bytes, from sender: 144906 pkts/219351284 bytes
receiver dump: 100.0% in 5.37s
Total: 222245 pkts/223376026 bytes, from sender: 144052 pkts/218058328 bytes
♥ Union of data from sender recorded on both sides: 144906 pkts/219351284 bytes
♦ Subset of ♥ which was not recorded at sender : 0 pkts/0 bytes
♣ Subset of ♥ which was not recorded at receiver : 854 pkts/1292956 bytes
♠ Loss (ratio of ♣ bytes to ♥ bytes) : 0.589%
Saving the data of the flow to the file...
==========================================
# and so on for the three more flows...
Для будущих графиков и генерации статистики дампы PCAP больше не нужны. Анализ дампов PCAP выполняется только один раз, а затем сценарий построения графиков можно запускать столько раз, сколько необходимо для файлов журнала данных, для быстрого создания различных графиков.
Сценарий построения plot.py
считывает файлы журналов данных потоков и генерирует графики и статистику в выходную папку ( graphs
по умолчанию). Могут быть созданы различные типы графиков и статистики:
-f, --per-flow Graphs and stats are generated per flow, i.e. each
graph has a separate curve per flow
-t, --total Total graphs and stats are generated for all flows
altogether, i.e. each graph has only one curve
-s "FIELD1 FIELD2...", --per-subset "FIELD1 FIELD2..."
Graphs and stats are generated per subset, i.e. each
graph has one curve per subset. Flows are in one
subset if they have the same values of the chosen
layout field(s). E.g. for -s "scheme direction", each
graph will have one curve per subset of flows having
both the same scheme name and direction. Currently
allowed layout fields: ['scheme', 'direction'].
Для выбранного типа создаются три линейных графика и одна диаграмма рассеяния:
Например, выше на рисунке можно увидеть график односторонней задержки для каждого потока для каждого пакета.
Средние графики усредняются за интервал времени агрегирования: любое положительное число с плавающей запятой, указанное с аргументом -i
, или 0,5 секунды по умолчанию.
График среднего индекса Джайна всегда содержит одну кривую, которая рассчитывается по кривым, присутствующим на соответствующем графике средней пропускной способности.
Аргументы -c
и -j
позволяют гибко менять цвета кривых на графиках.
Для выбранного типа создается файл статистики. Он не зависит от выбранного интервала агрегации и содержит:
Общая средняя односторонняя задержка и общая средняя односторонняя задержка на пакет на кривой — это одни и те же значения, рассчитанные разными способами.
Процесс установки выглядит следующим образом:
Установите коллекцию схем управления перегрузкой Pantheon и, при необходимости, локально добавьте в коллекцию дополнительные схемы.
Установите эмулятор CoCo-Beholder, используя его скрипт установки.
Сделанный. Протестируйте схемы из коллекции с помощью CoCo-Beholder.
Установка самого CoCo-Beholder тривиальна, а его сценарий установки install.sh
очень прост и короток. Однако установка коллекции схем Pantheon часто вызывает массу проблем. Кроме того, в некоторых дистрибутивах Linux просто есть ошибки. Поэтому смотрите подробную инструкцию по установке на Ubuntu 16.04, Ubuntu 18.04 и Debian 10.
Приведенные ниже инструкции были протестированы на виртуальной машине с новой установкой Ubuntu 16.04.6-desktop-amd64 (ноябрь 2019 г.).
В качестве общего примечания: если вам нужна схема bbr (TCP BBRv1.0), обязательно используйте ядро Linux >=4.9.
Свежие выпуски 16.04 LTS (16.04.5 и выше) поставляются с ядром Linux 4.15. CoCo-Beholder использует джиттер задержки tc qdisc NetEm , который не работает в ядре Ubuntu 4.15. Решение:
sudo apt-get install linux-image-4.13.0-39-generic linux-headers-4.13.0-39
linux-headers-4.13.0-39-generic linux-image-extra-4.13.0-39-generic
В файле /etc/default/grub
закомментируйте строку GRUB_HIDDEN_TIMEOUT=0
и выполните команду sudo update-grub
. Это позволит вам увидеть меню Grub после перезагрузки.
Перезагрузитесь и в меню Grub выберите Advanced options for Ubuntu
и там Ubuntu, with Linux 4.13.0-39-generic
. Проверьте работающее ядро командой uname -ar
.
Загрузите git-репозиторий Pantheon и git-подмодули включенных схем:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Вам необходимо установить только схемы с помощью команд ниже. Если последняя команда выдает ошибку типа Command "python setup.py egg_info" failed with error code 1...
, выполните sudo pip install --upgrade pip
и повторите неудачную команду. sudo apt-get install autoconf # for verus
sudo apt-get install nodejs-legacy # for webrtc
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
Теперь вы готовы протестировать схемы.
Приведенные ниже инструкции были протестированы на виртуальной машине с новой установкой Ubuntu 18.04.3-desktop-amd64 (ноябрь 2019 г.).
В качестве общего примечания: если вам нужна схема bbr (TCP BBRv1.0), обязательно используйте ядро Linux >=4.9.
В ядре Ubuntu 4.15 есть ошибка. При использовании Ubuntu >=18.04.3 вы получаете ядро >=5.0, поэтому переходите к следующему шагу.
Загрузите git-репозиторий Pantheon и git-подмодули включенных схем:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Вам необходимо установить только схемы с помощью команд ниже. sudo apt-get install autoconf # for verus
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
Теперь вы готовы протестировать схемы.
Приведенные ниже инструкции были протестированы на виртуальной машине с новой установкой Debian 10.1.0-amd64-netinst (ноябрь 2019 г.).
В качестве общего примечания: если вам нужна схема bbr (TCP BBRv1.0), обязательно используйте ядро Linux >=4.9.
В ядре Ubuntu 4.15 есть ошибка. Неясно, есть ли эта проблема в ядре Debian 4.15. В любом случае, с Debian >=10.1.0 вы получаете ядро >=4.19, поэтому, пожалуйста, переходите к следующему шагу.
Загрузите git-репозиторий Pantheon и git-подмодули включенных схем:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Вам необходимо установить только схемы. Сначала установим зависимости схем: sed -i ' s/chromium-browser/chromium/g ' src/wrappers/webrtc.py # for webrtc
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
Добавьте строку export PATH=/usr/sbin:$PATH
в файл ~/.bashrc
и запустите команду source ~/.bashrc
. Это активирует утилиту /usr/sbin/sysctl
, которая необходима не только во время установки, но и в дальнейшем.
Чтобы собрать Verus, вам необходимо понизить версию вашей библиотеки alglib. Поэтому, пожалуйста, добавьте deb <URL> stretch main
в ваш /etc/apt/sources.list
и запустите:
sudo apt-get update
sudo apt-get remove libalglib-dev # remove 3.14 version
sudo apt-get install -t stretch libalglib-dev # install 3.10 version
sudo apt-get install autoconf # for verus
myregex= ' s/milliseconds((.+))/milliseconds(int(1))/g '
sed -i $myregex third_party/verus/src/verus_client.cpp
sed -i $myregex third_party/verus/src/verus_server.cpp
sudo apt-get install pkg-config # for sprout
sudo apt-get install libtinfo5 # for quic
# During the setup, do not be afraid of CERTIFICATE_VERIFY_FAILED errors by quic
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
# matplotlib will give Python backports.functools_lru_cache error. To solve:
sudo pip install arrow==0.12.0
Теперь вы готовы протестировать схемы.
cd pantheon
src/wrappers/vegas.py setup_after_reboot # setup the scheme once after reboot
src/wrappers/vegas.py run_first # who is server: sender or receiver
# receiver
src/wrappers/vegas.py receiver 54321 # start server in one shell
src/wrappers/vegas.py sender 127.0.0.1 54321 # start client in another shell
sudo pkill -9 -f vegas # kill all the started processes
cd coco-beholder
myregex= ' s/((.+)).pid/(1, stdout=None, stderr=None).pid/g '
sed -i " $myregex " variable_delay/src/test/test.py
Если вы хотите протестировать схему, которой нет в коллекции Pantheon, вы можете добавить ее локально следующим образом:
find /lib/modules/ ` (uname -r) ` /kernel -type f -name * cdg *
# /lib/modules/4.19.0-6-amd64/kernel/net/ipv4/tcp_cdg.ko
cdg
в файл pantheon/src/config.yml
, в которой хранится список всех схем в коллекции. Цвет, имя и маркер могут быть любыми, поскольку CoCo-Beholder их не читает. cdg :
name : TCP CDG
color : red
marker : ' x '
cp pantheon/src/wrappers/vegas.py pantheon/src/wrappers/cdg.py
sed -i 's/vegas/cdg/g' pantheon/src/wrappers/cdg.py
Теперь вы можете протестировать cdg с помощью CoCo-Beholder, как обычно, указав потоки cdg в файле макета.
CoCo-Beholder гарантированно работает с Python 2.7, 3.5, 3.6 и 3.7. Сценарий установки CoCo-Beholder install.sh
по умолчанию устанавливает зависимости библиотеки Python 2. Для Python 3 закомментируйте соответствующие строки в скрипте установки.
CoCo-Beholder использует библиотеку Mininet: ее API, который позволяет создать виртуальный хост в виде оболочки UNIX в отдельном сетевом пространстве имен, создать парную связь между парой виртуальных хостов и запускать процессы на виртуальном хосте. CoCo-Beholder не использует контроллер, коммутатор, топологию, TCLink или другие объекты более высокого уровня Mininet. Чтобы предотвратить любые проблемы совместимости в будущем и упростить установку CoCo-Beholder, необходимые части Mininet 2.3.0d5 включены в репозиторий CoCo-Beholder в качестве сторонней библиотеки в соответствии с лицензией Mininet.
Евгения Хасина реализовала программу в рамках магистерской диссертации «The CoCo-Beholder: Enabling Comprehensive Evaluation of Congestion Control Algorithms» в Саарском университете в 2019 году под руководством профессора Ани Фельдманн и доктора Коринны Купетт на кафедре интернет-архитектуры Макса Планка. Институт информатики.
По всем вопросам по программе вы можете писать мне, Евгении Хасиной, на мой электронный адрес.