Quero simular o seguinte cenário: considerando que tenho 4 máquinas servidores ubuntu A, B, C e D. Quero reduzir a largura de banda da rede em 20% entre a máquina A e a máquina C e 10% entre A e B. fazer isso usando ferramentas de simulação / otimização de rede?
ubuntu
networking
tcp
linux-networking
bandwidth
Yehia Elshater
fonte
fonte
tc
faz quando usado com a marcação iptables.Respostas:
Para fazer isso, você pode usar
tc
sozinho osu32
filtros ou combiná- los com a marcação iptables (talvez mais direta se você não quiser aprender a sintaxe dos filtros complexos). No post a seguir, detalharei a solução anterior.Simulando sua configuração
Como exemplo, vamos considerar A, B, C e D executando interfaces virtuais de 10 Mbit / s .
Você basicamente quer:
Para simular isso, criarei 4 namespaces de rede e interfaces Ethernet virtuais conectadas a uma ponte.
Obviamente, no seu caso, você trabalhará com placas de rede reais e a ponte será seu gateway ou um switch, dependendo da sua infraestrutura.
Portanto, na minha simulação, teremos a seguinte configuração, em uma rede 10.0.0.0/24:
Primeiro, a fase de configuração é feita para que você possa entender do que é feito; pule se não estiver familiarizado com isso, não é grande coisa. No entanto, o que você deve saber é que o comando
ip netns exec <namespace> <command>
permite executar um comando em um namespace de rede (ou seja, em uma das caixas do sorteio anterior). Isso também será usado na próxima seção.Portanto, neste ponto, temos a configuração descrita anteriormente.
Modelando o tráfego
É hora de entrar no controle de tráfego para conseguir o que deseja. A
tc
ferramenta permite adicionar disciplinas de enfileiramento:Ele vem com 3 noções: qdisc , classes e filtros . Essas noções podem ser usadas para configurar o gerenciamento complexo de fluxo de pacotes e priorizar o tráfego com base em qualquer critério / critério que você desejar.
Em poucas palavras:
Tudo isso geralmente funciona como uma árvore onde as folhas são qdiscs e as classes são nós. A raiz de uma árvore ou subárvore será declarada como
<id>:
e os nós filhos serão declarados como<parent_id>:<children_id>
. Mantenha essa sintaxe em mente.No seu caso, vamos pegar A e renderizar a árvore com a qual você deseja configurar
tc
:Explicação:
1:
é o qdisc raiz anexado ao dispositivo vethA, será assumido explicitamente comohtb
no Hierarchy Token Bucket (o qdisc padrão de um dispositivo épfifo
oupfifo_fast
depende do sistema operacional). É especificamente apropriado para gerenciamento de banda. Os pacotes que não correspondem aos filtros definidos neste nível irão para a1:30
classe.1:1
será umahtb
classe que limita todo o tráfego do dispositivo a 10 Mbit / s.1:10
será umahtb
classe que limita o tráfego de saída a 9 Mbit / s (90% de 10 Mbit / s).1:20
será umahtb
classe que limita o tráfego de saída a 8 Mbit / s (80% de 10 Mbit / s).1:30
será umahtb
classe que limita o tráfego a 10 Mbit / s (fallback).:10, :20, :30
sãosfq
qdisc para enfileiramento estocástico de justiça. Em outras palavras, esses qdiscs garantirão justiça no agendamento da transmissão com base nos fluxos.Essa coisa toda é configurada pelos seguintes comandos:
A última coisa que precisamos é adicionar filtros para que os pacotes IP com IP de destino igual a B passem para a
1:10
classe e os pacotes IP com IP de destino igual a C passem para a1:20
classe:Agora que você entendeu, precisará adicionar
tc
regras semelhantes às B e C para que as transmissões para A dessas plataformas também sejam modeladas.Teste
Agora vamos testar. Para isso, estou acostumado a brincar pessoalmente
iperf
, consiste simplesmente em um único binário que pode ser executado como cliente ou servidor e envia automaticamente o máximo de tráfego possível entre os dois hosts.Entre A e B:
Obtemos nosso limite de 9 Mbit / s de largura de banda.
Entre A e C:
Obtemos nosso limite de 8 Mbit / s de largura de banda.
Entre A e D:
Aqui temos a velocidade máxima da interface virtual de 10 Mbit / s atingida.
Observe que o burst da primeira medida de cada execução pode ser melhor tratado nas
htb
classes, ajustando o parâmetro adequado.Limpando
Remover :
1:
:tc filter del dev vethA parent 1: prio 1 u32
.1:
:tc filter del dev vethA parent 1:
.1:20
e seus filhos:tc class del dev vethA parent 1:1 classid 1:20
.tc qdisc del dev vethA
.Para limpar o conjunto de simulação:
fonte
O Ubuntu possui IPFW portado no FreeBSD e o IPFW possui o DUMMYNET que permite gerenciar vários parâmetros de rede - largura de banda, atraso, taxa de perda de pacotes, etc.
fonte
O melhor é usar as ferramentas tc com o módulo netem agora integrado (pelo menos no servidor Ubuntu). Você pode encontrar mais informações neste artigo em Stackoverflow .
fonte
Trickle funciona bem.
Esta discussão mostra algumas limitações: /unix/109973/how-to-change-speed-limit-of-running-trickle-instance
fonte