Simulando links com o netem

Este artigo descreve o netem, uma disciplina de escalonamento de pacotes de rede do kernel do Linux que possibilita adicionar latência, jitter, delay, perda etc de pacotes a uma interface de rede para fins de testes e simulações.

[ Hits: 21.564 ]

Por: Daniel Bristot de Oliveira em 18/08/2009 | Blog: http://bristot.eti.br


O netem



Agora vamos ver alguns exemplos de uso do netem.

Delay

O primeiro exemplo mostra como adicionar delay fixo de 100ms em uma interface, neste exemplo eth0.

tc qdisc add dev eth0 root netem delay 100ms

Também é possível emular o jitter, isto é a variação do delay durante o tempo:

tc qdisc add dev eth0 root netem delay 100ms 10ms

Isto irá adicionar delay de 100ms com jitter de ±10ms aleatoriamente. Também possível adicionar uma correlação entre os de delay e jitter durante o tempo:

tc qdisc add dev eth0 root netem delay 100ms 10ms 25%

Isto fará com que o valor do delay dependa 25% do último tempo utilizado.

A variação do delay também pode variar de acordo com uma distribuição probabilística como: normal, pareto, paretonormal. Por exemplo, para simular uma distribuição normal de delay no exemplo anterior:

tc qdisc add dev eth0 root netem delay 100ms 10ms distribution normal

Perda de pacotes

Para simular a perda de 3% dos pacotes:

tc qdisc add dev eth0 root netem loss 3%

Assim, 3 de 100 pacotes serão descartados aleatoriamente. Como o delay, é possível manter correlação entre os pacotes descartados a cada iteração:

tc qdisc add dev eth0 root netem loss 3% 25%

Assim, os pacotes serão descartados a taxa de 3% onde um quarto da probabilidade dos pacotes a serem descartados depende da iteração anterior.

Duplicação de pacotes

A duplicação é especificada de forma semelhante a perda de pacotes.

tc qdisc add dev eth0 root netem duplicate 1%

Com isto 1 em cada 100 pacotes serão duplicados.

Alteração de pacotes

Também é possível corromper os pacotes por adicionar um bit de erro no pacote.

tc qdisc add dev eth0 root netem corrupt 0.1%

Com isto 1 em cada 1000 pacotes serão alterados/corrompidos.

Reordenação de pacotes

Por fim, é possível também alterar a sequência dos pacotes de duas formas, denominadas gap e reorder. A primeira maneira usa uma sequência fixa, reordenando um pacotes a cada N pacotes, como exemplo:

tc qdisc add dev eth0 root netem gap 5 delay 10ms

Isto irá enviar o 5º (10º, 15º, ...) pacote logo após o anterior, os demais sofrerão atraso de 10ms.

A segunda forma (reorder) é mais realística, fazendo com que uma percentagem aleatória de pacotes seja reordenada, como no exemplo:

tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

Vinte e cinco porcento dos pacotes serão reordenados (com 50% de correlação com a iteração anterior), os demais serão enviados com 10ms de delay.

Exemplo de uso

No ambiente de estudo, é preciso simular um Link de dados de 256kbit/s, com latência média de 100ms de RTT (tempo de ida e volta), jitter de 10ms e 1% de perda, em ambos os sentidos. Como o netem não faz controle de banda irá-se utilizar a disciplina de enfileiramento tbf para fazer o limite de banda.

Para isto irá-se configurar cada interfaces de rede, eth0 e eth1, com limite de banda de 256kbps, 50 ms de delay, 5ms de jitter e 0.5% de perda. Os comandos a serem executados são os seguintes:

# tc qdisc add dev eth0 handle 1: root tbf rate 256kbit buffer 1600 limit 3000
# tc qdisc add dev eth0 parent 1:10 handle 10:10 netem delay 50ms 5ms distribution normal loss 0.5%
# tc qdisc add dev eth1 handle 1: root tbf rate 256kbit buffer 1600 limit 3000
# tc qdisc add dev eth1 parent 1:10 handle 10:10 netem delay 50ms 5ms distribution normal loss 0.5%


A primeira linha adiciona o limite de banda a interface eth0 em 256kbit/s, e a segunda linha configura o netem para adicionar latência de 50ms, jitter de ± 5ms e perda de 0.5%. As outras duas linhas replicam a configuração para a interface eth1.

Também é possível fazer esta simulação utilizando somente uma interface de rede, para isto deve-se utilizar o device IFB, o mesmo exemplo anterior é feito utilizando a interface IFB:

# tc qdisc add dev eth0 handle 1: root tbf rate 256kbit buffer 1600 limit 3000
# tc qdisc add dev eth0 parent 1:10 handle 10:10 netem delay 50ms 5ms distribution normal loss 0.5%
# tc qdisc add dev eth0 ingress
# tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0
# tc qdisc add dev ifb0 handle 1: root tbf rate 256kbit buffer 1600 limit 3000
# tc qdisc add dev ifb0 parent 1:10 handle 10:10 netem delay 50ms 5ms distribution normal loss 0.5%


Neste exemplo as duas primeiras linhas são como a do exemplo anterior, a terceira adiciona a qdisc ingress na interface eth0, a segunda espelha o tráfego da eth0 como egress para a interface ifb0 e finalmente as duas últimas linhas configuram o limite de banda e o netem para a interface ifb0.

Testando com o ping:

# ping -c3 192.168.0.135
PING 192.168.0.135 (192.168.0.135) 56(84) bytes of data.
64 bytes from 192.168.0.135: icmp_seq=1 ttl=64 time=98.1 ms
64 bytes from 192.168.0.135: icmp_seq=2 ttl=64 time=108 ms
64 bytes from 192.168.0.135: icmp_seq=3 ttl=64 time=109 ms
--- 192.168.0.135 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2111ms
rtt min/avg/max/mdev = 98.175/105.161/109.067/4.965 ms

A latência está em cerca de 100ms, variando em 10ms e não houve perda, isto porque a taxa de perda é muito pequena e uma pequena amostra foi feita.

Considerações finais

O netem será utilizado para simulação de links de internet pois possibilita adicionar perda, delay e jitter no pc-gateway utilizado nos experimentos.

Ele se mostrou bastante simples de configurar e em experimentos pilotos (não exibidos aqui) se mostrou bastante estável e coerente como as configurações aplicadas.

Referências


Visite meu blog: http://bristot.eti.br/

Página anterior    

Páginas do artigo
   1. Introdução
   2. O netem
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Erro no KDM (temas) depois de update no Sabayon

Traceroute com ICMP e TCP

OpenVPN Matriz > Filial com PPTP

Novo método de instalação do Arch Linux (systemd)

Como gerenciar usuários e grupos

  
Comentários
[1] Comentário enviado por gustavoh84 em 18/08/2009 - 22:51h

Legal esse artigo, essa eu não conhecia, parabéns!

[2] Comentário enviado por acollucci em 19/08/2009 - 13:06h

E bem legal, mas ainda to digerindo...rs
parabens
att,
Anthny Collucci

[3] Comentário enviado por spolti em 20/08/2009 - 09:07h

Boa dica


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts