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: 22.850 ]

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

Configuração da placa wireless LinkSys WUSB54G com drivers de Linux

Configurando placas wireless baseadas no chip Realtek RTL8180 no Linux

Limitando banda com o CBQ

Implementando servidor LDAP no Ubuntu

DNS no Slackware

  
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