Adicionando latência com tc no Linux

De LCAD
Ir para: navegação, pesquisa


Provavelmente você nunca precisará fazer isso com a sua internet, mas, recentemente, encontrei-me em um dilema em que eu precisava para simular 120ms de latência de rede em meu ambiente de teste que consiste em máquinas para o VRC. É aí que o comando tc entra na história

Dentro das distribuições atuais do Linux há um componente do kernel chamado netem, que acrescenta emulação de rede e é usado para testar e simular os mesmos tipos de problemas se poderia ver em uma WAN (Wide Area Network). tc é um comando que permite adicionar regras para netem, especificamente abordaremos como adicionar latência de rede em um dispositivo específico com tc.

Instalação

O comando tc vem com o pacote iproute que é instalado por padrão no linux, não será necessário instalar quaisquer para usar o tc.

Adicionando Latência

O comando tc irá adicionar a quantidade de latência especificada, a fim de simular a mesma taxa de latência como meu ambiente de produção que terá de tomar minha latência desejada e subtrair o meu teste de metas de latência para descobrir a quantidade de latência que é necessário adicionar com netem.

 "Latência alvo de Produção" - "Test-alvo Latência" = "Latência adicionar via netem" 

A fim de determinar a latência de seu alvo de teste, você pode executar um ping simples e usar o tempo de ida e volta do ping para determinar suas redes latência. Neste caso, google.com será nosso alvo de teste.

 # ping google.com
 PING google.com (74.125.224.230) 56 (84) bytes de dados.
 64 bytes from lax04s08-in-f6.1e100.net (74.125.224.230): icmp_req = 1 ttl = 56 time = 24,1 ms
 64 bytes from lax04s08-in-f6.1e100.net (74.125.224.230): icmp_req = 2 ttl = 56 time = 24.2 ms
 64 bytes from lax04s08-in-f6.1e100.net (74.125.224.230): icmp_req = 3 ttl = 56 time = 21,9 ms 

Minha latência média para google.com é 23.6ms a fim de obter 120ms de latência que eu preciso adicionar 96.6ms, para facilidade de uso eu vou arredondar para cima a 97.

 #  tc qdisc add dev eth0 root netem delay 97ms

Para verificar o comando definir a regra de prazo tc-s.

# tc-s qdisc
qdisc netem 8002: dev eth0 root refcnt 2 limit 1000 delay 97.0ms

Como você pode ver a regra de atraso de 97ms foi adicionado à netem, agora vamos testar com outro ping.

# ping google.com
PING google.com (74.125.239.8) 56 (84) bytes de dados.
64 bytes from lax04s09-in-f8.1e100.net (74.125.239.8): icmp_req = 1 ttl = 56 time = 122 ms
64 bytes from lax04s09-in-f8.1e100.net (74.125.239.8): icmp_req = 2 ttl = 56 time = 120 ms
64 bytes from lax04s09-in-f8.1e100.net (74.125.239.8): icmp_req = 3 ttl = 56 time = 120 ms 

Agora meu tempo de ping de ida e volta está tomando 120ms.

 Nota: Como você está adicionando esta regra para uma interface específica de todo o tráfego de que a interface terá o atraso 97ms.

Remova a regra

Depois de ter completado o teste, você pode remover o atraso com o comando tc também.

# tc qdisc del dev eth0 root netem
# tc-s qdisc
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 

Estes ajustes não irão sobreviver a uma reinicialização, não deixe de conferir as regras netem depois de qualquer reinicialização.

Mais informações

Para maiores informações procure:

[tc: Adding simulated network latency to your Linux server]

[Adding Latency and Limiting Bandwidth]

[Tc manpage]