---- 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 é um emulador de rede virtual amigável que fornece a popular topologia de halteres de qualquer tamanho. Cada link da topologia pode ter taxa, atraso e tamanho de fila individuais. O link central também pode ter um atraso variável com jitter opcional. Fluxos de esquemas diferentes podem ser executados juntos na topologia por um tempo de execução especificado de segundos. Para cada fluxo, pode-se escolher sua direção e segundo inicial do tempo de execução.
Cada fluxo tem um host na metade esquerda e um host na metade direita da topologia e os hosts trocam o tráfego de um esquema com um host sendo o remetente e outro o receptor. Existe o roteador esquerdo que interconecta todos os hosts da metade esquerda e o roteador direito que interconecta todos os hosts da metade direita da topologia. Todos os fluxos compartilham o link central comum entre os dois roteadores.
Teste
Análise
Gráficos e geração de estatísticas
Instalação
Solução de problemas de um esquema
Adicionando um novo esquema
Suporte Python
Bibliotecas de terceiros
Autoria
Contato
Este comando especifica o caminho para a coleção contendo os esquemas a serem testados e executa o teste por 30 segundos, com o link central tendo taxa de 120 Mbps e o atraso variável (atraso base 20 ms, delta 500 ms, passo 10 ms, jitter 5 EM):
./run.py -p ~ /pantheon 20ms 0.5s 10ms 5ms -t 30 -r 120 -s 12345
Se esta for a primeira execução do script, o arquivo de layout padrão layout.yml
, mostrado abaixo, será gerado e usado. A configuração de teste resultante está presente no desenho da topologia do haltere no topo desta página. O arquivo de layout pode ser editado para obter configurações de teste muito mais complexas, com mais fluxos pertencentes a vários esquemas e com diversas configurações de rede.
# 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
A taxa, o atraso e o tamanho da fila são sempre instalados em ambas as interfaces nas extremidades de cada link na topologia usando o emulador de link tc
qdisc NetEm. Em particular, isto significa que o RTT de um link é o dobro do atraso (unidirecional). Somente o link central pode ter dois tamanhos de fila diferentes das interfaces em suas extremidades – veja os argumentos -q1
, -q2
, -q
na mensagem de ajuda do script. Por padrão, ambas as filas têm 1.000 pacotes.
O atraso variável no link central é definido por quatro argumentos posicionais: atraso base, delta, passo e jitter, onde o jitter pode ser ignorado. A cada tempo delta, o atraso é aumentado ou diminuído passo a passo, dependendo de um gerador pseudoaleatório, cuja semente pode ser especificada com o argumento -s
ou atribuída ao horário UNIX atual. Para ter um atraso constante no link central, escolha o delta >= the runtime -t
.
Em um diretório de saída escolhido, o arquivo metadata.json
é gravado contendo todos os parâmetros do teste, incluindo a semente do gerador. O arquivo pode ser enviado ao CoCo-Beholder no futuro para reproduzir totalmente o teste. Além disso, durante o teste, os arquivos de dump PCAP são gravados em todos os hosts da topologia haltere no diretório de saída usando tcpdump
. Assim, para o exemplo do desenho, foram gravados oito arquivos de dump PCAP.
Nota #1: O atraso máximo para cada link – lateral e central (jitter não contado) – pode ser especificado com a opção -m
. Para ter um atraso de onda quadrada no link central, defina o atraso máximo como a soma do atraso base e do passo.
Nota #2: O script de teste chama setup_after_reboot
no wrapper Pantheon de cada esquema no arquivo de layout antes de iniciar qualquer fluxo dos esquemas, para que o usuário não precise configurar manualmente os esquemas após cada reinicialização.
O script de análise aceita apenas dois argumentos: a pasta de entrada e a pasta de saída – dumps
e graphs/data
por padrão.
Primeiro, o script simplesmente copia o arquivo de metadados da pasta de entrada para a pasta de saída. Em seguida, o script processa um par de dumps PCAP <flow's starting #>-<scheme>-<sender/receiver>.pcap
de cada fluxo e extrai informações sobre os pacotes do fluxo no arquivo de log de dados json individual do fluxo. Por exemplo, para dois dumps de aproximadamente 12 GB, um arquivo de registro de dados de aproximadamente 300 MB é produzido.
A saída parcial do script de análise para o exemplo no desenho:
./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...
Para os próximos gráficos e geração de estatísticas, os dumps PCAP não são mais necessários. A análise dos dumps PCAP é executada apenas uma vez e, em seguida, o script de plotagem pode ser executado quantas vezes forem necessárias nos arquivos de registro de dados para produzir várias plotagens rapidamente.
O script de plotagem plot.py
lê arquivos de registro de dados dos fluxos e gera gráficos e estatísticas na pasta de saída ( graphs
por padrão). Diferentes tipos de gráficos e estatísticas podem ser gerados:
-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'].
Para um tipo selecionado, são gerados três gráficos de linhas e um gráfico de dispersão:
Por exemplo, acima, pode-se ver o gráfico de atraso unidirecional por fluxo por pacote para a configuração no desenho.
Os gráficos médios são calculados por um intervalo de tempo de agregação: qualquer número flutuante positivo fornecido com o argumento -i
ou 0,5 segundo por padrão.
O gráfico de índice médio de Jain sempre contém uma curva que é calculada sobre as curvas presentes no gráfico de rendimento médio correspondente.
Os argumentos -c
e -j
permitem alterar as cores das curvas nos gráficos de maneira flexível.
Para um tipo selecionado, o arquivo de estatísticas é gerado. Não depende do intervalo de agregação escolhido e contém:
O atraso unidirecional médio geral e o atraso unidirecional médio geral por pacote de uma curva são os mesmos valores calculados de maneiras diferentes.
O processo de instalação é o seguinte:
Instale a coleção Pantheon de esquemas de controle de congestionamento e, se necessário, adicione mais esquemas à coleção localmente
Instale o emulador CoCo-Beholder usando seu script de instalação
Feito. Teste os esquemas da coleção usando CoCo-Beholder.
A instalação do CoCo-Beholder em si é trivial e seu script de instalação install.sh
é super fácil e curto. No entanto, a instalação da coleção de esquemas Pantheon geralmente causa muitos problemas. Além disso, algumas distribuições Linux apresentam apenas bugs. Assim, consulte as instruções detalhadas para instalação no Ubuntu 16.04, Ubuntu 18.04 e Debian 10.
As instruções abaixo foram testadas na VM com uma nova instalação do Ubuntu 16.04.6-desktop-amd64 (novembro de 2019).
Como uma observação geral: se você precisar do esquema bbr (TCP BBRv1.0), certifique-se de usar o kernel Linux >=4.9.
Novas versões do 16.04 LTS (16.04.5 e superior) vêm com o kernel Linux 4.15. CoCo-Beholder usa tc qdisc NetEm delay jitter que está quebrado no kernel Ubuntu 4.15. A solução:
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
No arquivo /etc/default/grub
, comente a linha GRUB_HIDDEN_TIMEOUT=0
e execute o comando sudo update-grub
. Isso permitirá que você veja o menu Grub após a reinicialização.
Reinicie e no menu Grub, escolha Advanced options for Ubuntu
e aí Ubuntu, with Linux 4.13.0-39-generic
. Verifique o kernel em execução com o comando uname -ar
.
Baixe o repositório git do Pantheon e os submódulos git dos esquemas incluídos:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Você precisa instalar apenas os esquemas usando os comandos abaixo. Se o último comando fornecer um erro como Command "python setup.py egg_info" failed with error code 1...
, execute sudo pip install --upgrade pip
e repita o comando com falha. 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
Agora você está pronto para testar os esquemas.
As instruções abaixo foram testadas na VM com uma nova instalação do Ubuntu 18.04.3-desktop-amd64 (novembro de 2019).
Como uma observação geral: se você precisar do esquema bbr (TCP BBRv1.0), certifique-se de usar o kernel Linux >=4.9.
O kernel do Ubuntu 4.15 tem o bug. Com Ubuntu >=18.04.3, você obtém kernel >=5.0 então, por favor, prossiga para a próxima etapa.
Baixe o repositório git do Pantheon e os submódulos git dos esquemas incluídos:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Você precisa instalar apenas os esquemas usando os comandos abaixo. 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
Agora você está pronto para testar os esquemas.
As instruções abaixo foram testadas na VM com uma nova instalação do Debian 10.1.0-amd64-netinst (novembro de 2019).
Como uma observação geral: se você precisar do esquema bbr (TCP BBRv1.0), certifique-se de usar o kernel Linux >=4.9.
O kernel do Ubuntu 4.15 tem o bug. Não está claro se o kernel 4.15 do Debian tem esse problema. De qualquer forma, com o Debian >=10.1.0, você obtém o kernel >=4.19 então, por favor, prossiga para o próximo passo.
Baixe o repositório git do Pantheon e os submódulos git dos esquemas incluídos:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Você precisa instalar apenas os esquemas. Primeiro, instale as dependências dos esquemas: 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> ... " )
Adicione a string export PATH=/usr/sbin:$PATH
ao seu arquivo ~/.bashrc
e execute o comando source ~/.bashrc
. Isso ativará o utilitário /usr/sbin/sysctl
, que é necessário não apenas durante a instalação, mas também posteriormente.
Para construir o Verus, você precisa fazer o downgrade de sua biblioteca alglib. Então, por favor, adicione a linha deb <URL> stretch main
ao seu /etc/apt/sources.list
e execute:
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
Agora você está pronto para testar os esquemas.
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
Se quiser testar um esquema que não está presente na coleção Pantheon, você pode adicioná-lo localmente da seguinte forma:
find /lib/modules/ ` (uname -r) ` /kernel -type f -name * cdg *
# /lib/modules/4.19.0-6-amd64/kernel/net/ipv4/tcp_cdg.ko
cdg
ao arquivo pantheon/src/config.yml
que mantém a lista de todos os esquemas na coleção. A cor, o nome e o marcador podem ser qualquer um porque o CoCo-Beholder não os lê. 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
Agora você pode testar o cdg com o CoCo-Beholder normalmente, especificando os fluxos do cdg no arquivo de layout.
CoCo-Beholder funciona com Python 2.7, 3.5, 3.6 e 3.7. O script de instalação install.sh
do CoCo-Beholder instala as dependências da biblioteca Python 2 por padrão. Para Python 3, por favor, comente as linhas correspondentes no script de instalação.
CoCo-Beholder utiliza a biblioteca Mininet: sua API que permite criar um host virtual como um shell UNIX em um namespace de rede separado, para criar um link de par veth entre um par de hosts virtuais e para iniciar processos em um host virtual. CoCo-Beholder não usa Controlador, Switch, Topologia, TCLink ou outras entidades de nível superior do Mininet. Para evitar quaisquer problemas futuros de compatibilidade e facilitar a instalação do CoCo-Beholder, as partes necessárias do Mininet 2.3.0d5 estão incluídas no repositório CoCo-Beholder como uma biblioteca de terceiros de acordo com a licença do Mininet.
Evgeniya Khasina implementou o programa no âmbito da tese de mestrado "The CoCo-Beholder: Enabling Comprehensive Evaluation of Congestion Control Algorithms" na Saarland University em 2019 sob a supervisão da Professora Anja Feldmann e da Dra. Instituto de Informática.
Para qualquer dúvida sobre o programa, você pode escrever para mim, Evgeniya Khasina, para meu endereço de e-mail.