Eu tenho um roteador/gateway no Linux, quero adicionar um pouco de QoS para reservar largura de banda para um fluxo específico. Isso pode ser feito com iptables/netfilter e tc, mas todos os exemplos começam com o fato de você saber antecipadamente a largura de banda total disponível.
O problema é que minha WAN é uma conexão 3G em movimento, com desempenhos variáveis. No dia 1, posso ter 5 Mbps e no dia chuvoso 2 cai para 2 Mbps. Como posso garantir que meu fluxo 1 sempre terá 100Kbps disponíveis com baixa latência?
Pensei em uma solução complexa, com um script diário ou horário para verificar a largura de banda e criar e aplicar scripts de QoS dinamicamente, mas não é uma boa solução para mim.
Você deve ser capaz de atingir seu objetivo com o agendador hfsc. Você terá a capacidade de reservar uma parte da largura de banda e dar garantia de baixa latência com "tempo real", as outras classes preencherão proporcionalmente o restante da largura de banda com "linkshare".
É importante aqui usar o tempo real e não o linkshare, porque o tempo real, para garantir o envio de um pacote nos últimos milissegundos, é capaz de impedir a outra classe de enviar um pacote.
Para realizar o que você deseja, você precisa definir um limite superior alto na classe raiz (talvez 10 MB), mas não ul nas folhas. Devido à maneira como o compartilhamento de link hfsc está compartilhando a largura de banda entre todas as classes "ls", eles compartilharão a largura de banda disponível, acima do valor m2, se houver mais.
Por exemplo, você poderia usar este tipo de configuração:
Os valores podem precisar ser alterados de acordo com a sua necessidade, principalmente na classe 100, embora eu tenha tentado escrever esses números para caber no seu 3G.
Você deve ler mais sobre man tc-hfsc, este post e este artigo para saber mais sobre o hfsc e como ele funciona.