Limitando a largura de banda no Ubuntu Linux

4

Estou na situação em que tenho que simular um ambiente P2P (para minha tese de mestrado em ciência da computação). Para fazer isso, estou usando o Docker com o Ubuntu para criar um monte de máquinas virtuais que serão conectadas em uma rede BitTorrent. Depois, preciso ter certeza de que a taxa de upload e download dos peers pode ser definida, e não é uma opção para mim fazer isso no cliente (como o cliente usa para dormir para simular uma largura de banda menor e isso resulta em picos no taxa).

Portanto, estou tentando fazer isso para cada contêiner. Para ser honesto, eu não me importo como isso é feito, desde que funcione, mas eu tentei coisas diferentes sem sorte. Estas são as coisas que tentei até agora:

  1. Gotejamento Trickle parece estar fazendo o truque, mas por alguma razão, quando eu começo com mais de 5 contêineres do Docker, o Trickle fará com que muitos deles saiam sem me dizer por quê. Eu tentei configurações diferentes, mas você não tem muitos botões para girar quando se trata de configuração, então eu não acho que o Trickle será uma opção neste cenário.
  2. Wondershaper Usando o Wondershaper parece funcionar, ou pelo menos limita a largura de banda. O único problema aqui é que não há correlação aparentemente compreensível entre o valor definido nas opções e a largura de banda real. Quando eu configurei o download de 2048 (que deve ser kbits), o download real varia entre 550KB e 900KB, o que parece muito estranho.
  3. tc Usar tc, como muitas pessoas sugeriram para questões semelhantes, realmente limita a largura de banda, mas não importa qual valor eu configure, sempre me dá a mesma largura de banda (cerca de 15-20KB / s).

Eu tentei seguir toneladas de guias e exemplos, mas cada um deles não funcionou ou está descrito acima. Eu estou um tanto perdido aqui, então se alguém souber de alguma razão os exemplos acima devem funcionar ou ter outra solução, seria incrível.

O que estou procurando é uma maneira de limitar uma única instância do Linux, e então eu deveria ser capaz de fazer esse trabalho para vários contêineres do Docker.

--------------- EDITAR ----------------

Eu tentei alguns comandos tc diferentes, mas um deles é assim

DEV=eth0
tc qdisc del dev $DEV root
tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 100mbit
tc class add dev $DEV parent 1: classid 1:1 cbq rate 256kbit allot 1500 prio  5 bounded isolated
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 match ip src 0.0.0.0/0 flowid 1:1
tc qdisc add dev $DEV parent 1:1 sfq perturb 10

Não importa a taxa que eu defino, sempre me dá download de cerca de 12 KB / s (o download padrão sem limite é de cerca de 4MB / s)

------------ EDIT 2 (o que acabei fazendo) ------------

Acontece que você não pode configurar com confiança a largura de banda para os contêineres Docker dentro dos contêineres, mas sempre que você cria um novo contêiner, uma interface virtual é criada na máquina host chamada vethsomething. Se você usar, por exemplo, o Wondershaper nessas interfaces virtuais, o limite terá o comportamento correto:)

    
por Kasper Vesth 11.05.2015 / 11:03

1 resposta

4

Usando tc (porque é o mais atual, e eu sou o mais familiarizado com ele), você deve ser capaz de diminuir o tráfego sem problemas.

Eu tenho um servidor atuando como o firewall (chamado de 'firewall' - muito criativo) e depois um segundo servidor (chamado 'mil102'). sem nenhum comando tc, scp'ando um arquivo de mil102 para movimentos de firewall a toda velocidade:

root@firewall:/data#scp mil102:/root/test.tgz test.tgz
test.tgz       100%  712MB  71.2MB/s   00:10

Adicionando os seguintes comandos ao mil102 (é mais fácil moldar o tráfego de envio):

#!/bin/sh
DEV=eth0
tc qdisc del dev $DEV root
tc qdisc add dev $DEV handle 1: root htb default 11
tc class add dev $DEV parent 1: classid 1:1 htb rate 4Mbps
tc class add dev $DEV parent 1:1 classid 1:11 htb rate 4Mbit
tc qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 10

Agora, o mesmo comando desacelera para 4Mb:

root@firewall:/data#scp mil102:/root/test.tgz test.tgz
test.tgz         0% 6064KB 467.0KB/s   25:48 ETA

Parei a transferência - demoraria muito tempo. A velocidade listada no scp é em bytes, especificada em tc em bits, então 467KB * 9 = 4203Kb, perto do meu limite de 4096Kb (pensei que seria * 8, mas eu acho que há um bit de paridade?).

Eu tentei mudar para 10Mbit e meu scp mostrou que eu estava movendo dados a 1.1MB por segundo (1.1 * 9 = 9.9).

A última linha com a diretiva 'sfq perturb 10' foi adicionada para nivelar o fluxo de tráfego em uma conexão carregada. Ele direciona a fila para receber pacotes de cada conversa com base em um hash round-robin.

Você pode testar com e sem - ssh para uma máquina carregada sem entrar em rajadas, com será muito mais suave (muito importante para VOIP). A 'perturbação 10' diz para recalcular o algoritmo de hash a cada 10 segundos para torná-lo aleatório.

    
por 13.05.2015 / 20:45