Quero que uma determinada placa de rede se comporte como se fosse uma placa de rede mais lenta. Como se a interface 1G do meu laptop fosse na verdade uma interface de 100M ou 10M. Uma maneira de fazer isso é desenterrar meu antigo hub de 10 bits e usá-lo para essa finalidade.
Tenho certeza de que existe uma "solução de software" para isso. E, de fato, parece que o tc
comando e o tbf
recurso são capazes de fazer isso.
Infelizmente, não compreendo totalmente o conceito para alcançar o que escrevi acima. Parece que há alguma matemática envolvida para levar em consideração a velocidade do link assumida /sys/class/net/*/speed
, provavelmente o MTU de /sys/class/net/*/mtu
e a taxa de tick do sistema. Não tenho certeza se o último ainda é necessário atualmente com os kernels de distribuição "atuais" (eu tenho CONFIG_NO_HZ=y
e CONFIG_HZ_300=y
por exemplo).
Como seria um script de shell para tornar esse recurso mais genérico? Comobash link-bandhwidth.sh <interface> 10m|100m|1G|2.5G|10G
Editar:
Conforme sugerido por @vidarlo, alterar a velocidade do link realmente funciona. Consegui alterar a lista de velocidades anunciadas para portas individuais no switch. Tive resultados mistos com o uso do ethtool, mesmo em placas mlx5 que ofereciam várias velocidades diferentes.
Eu também tenho uma placa mlx4 que suporta apenas uma velocidade. Aqui tentei o nc
comando sugerido, mas incompleto. Daí a questão de como gerar programaticamente os valores ideais. Esta parte permanece sem resposta, até agora. Para mim, um comando como este funcionou em um link 10G de velocidade fixa:
tc qdisc add dev $interface root tbf rate 2000mbit latency 1ms burst 2000mbit
Isso se comporta como uma placa 2G hipotética, mas provavelmente os valores de latência e burst têm espaço para melhorias. Também tentei 1000mbit
e 100mbit
com os resultados esperados.
Usar
ethtool
:ethtool -s $IFACE speed 1000
Observe que geralmente muitos SFPs suportam apenas uma única velocidade. A execução
ethtool $IFACE
mostrará taxas e modos suportados.Além disso, você pode usar
tc
para reduzir a largura de banda disponível ; isso não afeta a velocidade do link do cartão, mas pode moldar o fluxo de dados:tc qdisc add dev $IFACE root tbf rate 100mbit
Como já foi dito, dê uma olhada em
ethtool
.Primeiro execute
ethtool <ifname>
e dê uma olhada emSupported link modes
eLink partner advertised link modes
. A interseção dos dois conjuntos fornece as velocidades de link disponíveis em ambas as extremidades do cabo e às quais você pode limitar a velocidade do link físico.Depois disso, dê uma olhada na
ethtool
página de manual, logo abaixoadvertise
da opção. Traduza a(s) velocidade(s) em máscaras de bits apropriadas e emita (como root)ethtool -s <ifname> advertise <number>
para limitar a(s) velocidade(s) indicada(s) pelos bits em <valor>.