Limitar largura de banda e latência de entrada e saída no linux

15

Sei que muitas perguntas semelhantes já foram feitas, mas até agora ainda não encontrei uma solução para o meu problema.

Eu tenho um servidor linux virtual (executando o Debian Squeeze) que uso para testar a velocidade dos sites, a fim de medir o aumento e a diminuição do tempo de carregamento desses sites. Estou tentando limitar a largura de banda e a latência desse servidor para poder aproximar-me dos tempos de carregamento do mundo real nos sites, mas até agora falharam.

O que eu quero especificamente é o seguinte:

  • Para definir uma latência de entrada e saída de 50 ms.
  • Para definir um limite de largura de banda de entrada de 512 kbps.
  • Para definir um limite de largura de banda de saída de 4096 kbps.

Estive lendo no netem e usando o tccomando, mas ainda está um pouco acima da minha cabeça. Eu consegui montar este comando para controlar a latência que parece funcionar, mas não tenho certeza se isso lida apenas com a latência de saída ou com ambas:

tc qdisc add dev eth0 root netem delay 50ms

Algum guru da rede por aí que possa me ajudar?

Editar:

Após mais pesquisas, cheguei a meio caminho do meu objetivo, usando este comando todo o tráfego de saída se comporta como eu quero:

tc qdisc add dev eth0 root tbf rate 4.0mbit latency 50ms burst 50kb mtu 10000

No entanto, ainda não consegui controlar o tráfego de entrada corretamente. Eu aprendi que eu deveria usar um "filtro Policer do Ingress". Eu tenho tentado fazer exatamente isso com o comando abaixo, brincando com valores diferentes, mas sem sorte.

tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match ip src 0.0.0.0/0 flowid :1 police rate 1.0mbit mtu 10000 burst 10k drop

A largura de banda é afetada pelo comando, porém, os valores acima fazem a velocidade iniciar em 2MB / se, conforme a transferência progride, diminuindo lentamente para cerca de 80-90kB / s que atinge após cerca de 30 segundos de transferência.

Alguma idéia do que estou fazendo de errado?

yzfr1
fonte
netem delay 50msnão limita a latência. Aumenta a latência em 50mscomparação com o que seria de outra forma.
kasperd
Na verdade você está certo. Removido o limite de palavras, porque foi um aumento de 50 ms eu estava realmente procurando (como se fosse uma máquina virtual no mesmo computador a latência original perto o suficiente para 0 anyway)
yzfr1

Respostas:

12

Finalmente resolvi definir apenas a largura de banda / latência de saída no servidor e, em seguida, fazer o mesmo no cliente, atingindo efetivamente o mesmo resultado.

Estes são os comandos que executei no servidor e no cliente, respectivamente, para atingir meus objetivos:

Servidor: 4 Mbit 50 ms

tc qdisc add dev eth0 handle 1: root htb default 11
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 4Mbit
tc qdisc add dev eth0 parent 1:11 handle 10: netem delay 50ms

Cliente: 512 kbit 50 ms

tc qdisc add dev vmnet1 handle 1: root htb default 11
tc class add dev vmnet1 parent 1: classid 1:1 htb rate 1000Mbps
tc class add dev vmnet1 parent 1:1 classid 1:11 htb rate 512kbit
tc qdisc add dev vmnet1 parent 1:11 handle 10: netem delay 50ms
yzfr1
fonte
Eu tenho procurado por isso há meses. Obrigado. Uma questão? Como você exclui a regra? tc class del dev root eth0 mostra as respostas RTNETLINK: Nenhum arquivo ou diretório é esse #
Nur
Isso foi há alguns meses atrás, mas eu me lembro de que basta remover a raiz qdisc: tc qdisc del dev eth0
yzfr1
2

Cerca de 80-90 kByte / s é sobre o que esperar de

    tc filter add ... police rate 1.0mbit ...

Você pede que os dados recebidos sejam jogados fora quando chegam a 1 mBit / s, ou seja, 125 kByte / s. O servidor remoto cairá para consideravelmente mais baixo que isso (talvez metade, não tenho certeza). Depois disso, todos os pacotes passam, então a extremidade remota aumenta a velocidade lentamente até que 125 kByte / s sejam atingidos novamente. Você obtém uma taxa de transferência média consideravelmente abaixo de 125 kByte / s, o que é típico da forma de entrada.

Estou um pouco surpreso que a velocidade atinja 2 MByte / s com o filtro de política de ingresso já instalado. Onde você mediu - no cliente downstream (programm) ou em algum roteador upstream? Ou talvez você tenha iniciado a conexão e só depois tenha acionado o filtro de política de entrada?

amante anônimo do linux
fonte