Tutorial como resolver problema de Bufferbloat com OpenWRT
Objetivos
- Entender o que é o BufferBloat
- Saber o significado de QoS e SQM
- Aprender sobre Packet Steering e IRQbalance
- Passo a passo para resolver problemas de BufferBloat do seu roteador configurado com OpenWRT
O que BufferBloat causa?
Uma maneira objetiva de explicar o bufferbloat é explicar o que este causa. Basicamente, o efeito principal do bufferbloat é o aumento da latência da rede. Pode influenciar no atraso/sincronia dos pacotes que causa jitter e até impactar de forma crônica a velocidade de transferência da rede.
Em qual cenário o bufferbloat é mais evidente?
É comum verificar seus efeitos em redes com muitos clientes e aplicações que exigem do throughput da rede: streaming e voip. Usuários que demandam da rede para jogos online também são afetados negativamente pelo bufferbloat. Os efeitos mais comuns que os usuários relatam é um ping mais alto com o servidor destino e efeitos de lag durante a partida online. Tais efeitos ficam mais evidentes em equipamentos de rede de entrada (equipamentos com poucos recursos).
Na prática, o que é o Bufferbloat?
De forma sucinta, é um efeito negativo de aumento de latência devido ao buffer dos equipamentos de rede, quando estes estão sob estresse. A grande demanda na rede pode ocasionar um aumento excessivo da utilização dos buffers, causando um efeito cascata de atraso de pacotes.
O que significa QoS?
O termo QoS é um acrônimo para “Quality of Service” ou Qualidade do Serviço. Pode ser explicado como um conjunto de prioridades especificamente definidas para o controle do tráfego da rede, garantindo prioridade para serviços/aplicações mais sensíveis/críticas racionalizando o uso da rede.
Lembrando que para um QoS real, seria necessário garantir a qualidade do serviço de ponta a ponta. Quando habilitamos o QoS em nosso roteador pessoal, vamos definir as prioridades do serviço somente em nossa rede local.
O que significa SQM?
O termo SQM é um acrônimo para “Smart Queue Management” ou Gerenciamento Inteligente de Filas. É utilizado para melhorar o fluxo de informação em redes de computadores, muito utilizado com as metodologias de Gerenciamento de Tamanho de Fila Ativa (AQM), QoS, limitação de banda e modelagem de tráfego.
O que é Packet Steering?
Alguns equipamentos de rede possuem implementação em hardware para trabalhar com múltiplos núcleos da CPU, para transmissão e recebimento de pacotes. Porém, nem todos os equipamentos possuem esta implementação, e trabalham apenas com uma fila para processamento dos pacotes, usualmente esta fila é processada por apenas um núcleo da CPU. Pensando na evolução dos processadores ao longo dos anos, é possível verificar o foco no aumento dos núcleos e na otimização de eficiência. Então faz sentido a implementação em software de um procedimento para paralelizar o fluxo da rede, para que o fluxo de informação (pacotes) possa ser processado por vários núcleos, otimizando o funcionamento do equipamento.
O termo “Packet Steering” ou “Receive Packet Sterring” (RPS) é uma técnica onde é criado um hash do número da porta e IP da requisição de rede, que é utilizado para determinar qual core da CPU será responsável pelo pacote, nesta implementação de fluxo paralelizado. Desta forma, ele também garante que um conjunto de pacotes de um mesmo fluxo de informação seja alocado no mesmo núcleo da CPU. Para um balanceamento do fluxo em todos os núcleos do processador o packet steering é utilizado junto com o daemon do irqbalance.
Para que serve o IRQbalance?
É uma implementação de um daemon para o sistema operacional Linux com a finalidade de reorganizar/distribuir pedidos de interrupções em vários núcleos do processador. É utilizado juntamente com o packet steering, para prover o serviço. Sua utilização pode resultar em um melhor desempenho da rede de forma geral.
Lembrando que caso seu roteador tenha recursos limitados/escassos, habilitar o packet steering+irqbalance pode piorar o desempenho da rede. Muitas vezes isto acontece pois a implementação em software destes recursos consome mais poder de processamento da CPU. Caso o processador não seja eficiente o suficiente, sendo um gargalo para o sistema, ou sofrer de throttling por causa do aumento da temperatura; o desempenho da rede pode piorar.
Os requisitos para seguir este tutorial
Este tutorial tem foco em resolver o problema de BufferBloat da sua rede doméstica/corporativa através de recursos de software presentes no repositório do OpenWRT. Desta forma é necessário que seu roteador tenha o OpenWRT instalado.
Lembrando que as variáveis controláveis deste processo estão dentro da nossa rede, vamos habilitar as funcionalidades do roteador para mitigar o bufferbloat da nossa rede particular/doméstica. Não temos como mitigar o bufferbloat externamente a nossa rede.
De forma geral, roteadores de marcas conceituadas no mercado, já possuem estas opções de QoS/SQM + Packet Steerring implementadas em seus respectivos sistemas embarcados. Antes de cogitar instalar OpenWRT em seu roteador ou comprar um roteador habilitado, verifique se já não possui esta funcionalidade no seu roteador atual.
Passo a passo para resolver o problema de Bufferbloat com OpenWRT
De forma geral, a metodologia utilizada, segue as etapas:
- Realizar teste de velocidade da rede em vários momentos do dia, para ter uma média de velocidade de download e upload
- Realizar o teste de BufferBloat e verificar o estado da rede
- Habilitar packet steering, qos/sqm e irqbalance no OpenWRT
- Configurar as métricas do QoS/SQM
- Testar novamente a rede para verificar o estado do Bufferbloat
- Repetir os itens 4 e 5 (realizando um ajuste fino) até conseguir um resultado satisfatório
Segue então os passos de forma detalhada, para resolver os problemas de bufferbloat de sua rede:
Passo 1
O primeiro passo é verificar a velocidade da internet. Mesmo se souber exatamente a velocidade contratada, é interessante realizar o teste, pois muitas operadoras oferecem uma banda de internet um pouco maior. O ideal é realizar testes ao longo do dia e ter uma média de velocidade. Alguns sites recomendados para realizar teste:
Eu particularmente gosto do teste da cloudflare para testes reais de velocidade. O Speedtest muitas vezes mostra velocidades de pico da rede. Mas tive mais sucesso utilizando o speedtest para ajustes finos de velocidade junto ao QoS (vou explicar melhor nos próximos passos).
Passo 2
Agora precisamos verificar a qualidade da rede no quesito de teste de bufferbloat. Uma opção é acessar o site da Waveform e realizar o teste.
https://www.waveform.com/tools/bufferbloat
Para realizar este teste adequadamente, é interessante que sua rede doméstica esteja sem utilização. O teste consiste em comparar a latência da sua rede com fluxo baixo de requisições. Em seguida ele compara a latência com um fluxo alto de transferência. Se tiver outros usuários utilizando a rede, o teste pode perder um pouco a precisão.
O resultado do teste é baseado em métricas de qualidade, com notas baseadas em letras: A+, A, B, C, D…
Para conseguir um resultado excelente, é interessante que no teste o aumento de latência com fluxo alto de transferências seja muito baixo, próximo a zero. Desta forma, irá conseguir nota A+.
Lembrando que muitas vezes a rede da operadora pode estar mal dimensionada, dificultando mitigar os problemas de bufferbloat ponto a ponto. Mas pelo menos, dentro da sua rede doméstica, poderá otimizar da melhor forma possível.
Neste teste, repare no aumento da latência em download e upload, e sua nota. Se receber uma nota A ou B, provavelmente já possui um bom roteador, necessário apenas alguns ajustes. Se receber nota C ou pior, talvez sua rede tenha alta utilização, e seus equipamentos estejam subdimensionados.
Lembrando que o indicado é realizar este teste via cabo de rede, evitar as latências extras que o wifi pode adicionar na rede.
Passo 3
Após realizar os testes acima e anotar os resultados, vamos para a etapa de configuração do roteador.
Conecte no seu roteador com OpenWRT instalado. Neste exemplo, o roteador está configurado no IP e será acessado pelo browser:
192.168.1.1
Passo 4
Agora vamos ativar a opção de Packet Sterring.
No menu, vá na aba “Network” e selecione a opção:
Interfaces
Na página de Interfaces, selecione a aba de:
Global network options
Agora marque o checkbox de:
Packet Steering
Clique na opção de:
Save & Apply
Passo 5
Vá novamente até o menu, selecione a aba “System” e clique na opção:
Software
Na página de instalação de softwares, clique no botão:
Update lists…
Agora está tudo pronto para buscar a instalar novos pacotes no roteador.
Passo 6 – Instalar suporte QoS/SQM no OpenWRT
No textfield do campo Filter, busque pelo pacote:
luci-app-sqm
O pacote vai aparecer na lista abaixo, clique no botão:
Install…
Lembrando que ao instalar o luci-app-sqm, ele já vai instalar os demais pacotes de dependência, como o sqm-scripts, etc.
Passo 7 – Instalar, ativar, verificar funcionamento e testar o irqbalance
Instalar o irqbalance
Agora vamos instalar o pacote do irqbalance.
Novamente, vá até o textfield de Filter, mas agora busque pelo pacote:
irqbalance
O pacote irqbalance vai aparecer logo abaixo, clique no botão:
Install…
Verificar funcionamento irqbalance
Lembrando que o pacote irqbalance não vem ativado por padrão. É necessário ir até a aba do menu “System” e clicar na opção:
Startup
É necessário habilitar (enable) o mesmo no início do sistema. Clique no botão
Enable
Em seguida, clique no botão:
Restart
Para ter certeza que o daemon está ativo, vá na aba do menu “Status” e clique na opção:
Processes
Se encontrar o processo do irqbalance, como mostrado na imagem, o daemon está em funcionamento. Mas é comum que o mesmo não inicie pela interface. Caso o seu não esteja habilitado, será necessário habilitar pela linha de comando.
Ativar irqbalance pela linha de comando
Conecte no roteador por SSH, com usuário@IP. Neste exemplo, vamos conectar com o usuário root.
ssh root@192.168.1.1
Edite o arquivo de configuração do irqbalance (se utilizar o editor nano, precisa instalar o mesmo antes):
nano /etc/config/irqbalance
Na linha:
option enable '0'
Altere para:
option enable '1'
Salve as modificações e feche o modo edição do arquivo.
Necessário então ativar o serviço:
service irqbalance start
Para ver o funcionamento, execute o comando:
service irqbalance status
Se receber a mensagem de “running” o daemon está ativo.
Testar irqbalance pela linha de comando
Bom, se seguiu os passos anteriores corretamente, o daemon do irqbalance deve estar ativo. Porém é interessante verificar o funcionamento. Nesta etapa, precisamos verificar se o irqbalance está dividindo as requisições de rede entre todos os núcleos disponíveis da CPU. Vamos executar o comando abaixo e verificar se na interface eth0 (WAN no meu caso) as requisições estão sendo distribuídas:
cat /proc/interrupts
Vamos reparar na saída abaixo:
root@OpenWrt:~# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 3: 499 130 250 795 GICv2 30 Level arch_timer 11: 971 0 0 0 GICv2 65 Level fe00b880.mailbox 14: 2 0 0 0 GICv2 153 Level uart-pl011 17: 31 0 0 0 GICv2 114 Level DMA IRQ 24: 1 0 0 0 GICv2 66 Level VCHIQ doorbell 25: 629 0 0 0 GICv2 158 Level mmc1, mmc0 31: 740 0 0 0 GICv2 189 Level eth0 32: 141 0 0 0 GICv2 190 Level eth0 38: 0 0 0 0 GICv2 175 Level PCIe PME, aerdrv 39: 781 0 0 0 BRCM STB PCIe MSI 524288 Edge eth1 IPI0: 248 546 1250 390 Rescheduling interrupts IPI1: 30 45 34 68 Function call interrupts IPI2: 0 0 0 0 CPU stop interrupts IPI3: 0 0 0 0 CPU stop (for crash dump) interrupts IPI4: 0 0 0 0 Timer broadcast interrupts IPI5: 174 870 138 439 IRQ work interrupts IPI6: 0 0 0 0 CPU wake-up interrupts Err: 0
A primeira coluna do exemplo acima é destinada aos IRQ’s. Neste exemplo, estamos utilizando um Roteador com Raspberry Pi CM4, que possui 4 núcleos. Então as 4 colunas seguintes, após a coluna de IRQ diz respeito a cada núcleo. Repare nas linhas do IRQ 31 e 32, que dizem respeito a interface ETH0 (wan). O ideal é que as requisições estivessem distribuídas entre os 4 núcleos e não concentradas apenas no primeiro número (CPU0).
Caso tenha problema no IRQ balance, é possível que sua internet fique mais lenta quando ativar o QoS/SQM, pois apenas um núcleo não irá conseguir processar toda a demanda. Verificando no fórum do OpenWRT, em uma das atualizações da versão 22.03 houve problemas de execução do irqbalance e uma issue foi aberta no github. Caso venha a ter problemas, o recomendado é atualizar todo o sistema para uma versão atualizada mais estável.
Caso não seja possível atualizar o sistema operacional de forma alguma, é possível definir manualmente qual núcleo cada interface deve utilizar. Ver a página do mantenedor no irqbalance para mais detalhes.
Atualizei o OpenWRT para a última versão disponível e o IRQbalance voltou a funcionar:
CPU0 CPU1 CPU2 CPU3 11: 10918 30975 23301 27570 GICv2 30 Level arch_timer 18: 283 0 0 0 GICv2 65 Level fe00b880.mailbox 21: 2 0 0 0 GICv2 153 Level uart-pl011 24: 31 0 0 0 GICv2 114 Level DMA IRQ 31: 133 0 0 0 GICv2 66 Level VCHIQ doorbell 32: 9339 0 0 0 GICv2 158 Level mmc1, mmc0 39: 568 10111 0 0 GICv2 189 Level eth0 40: 136 0 0 65735 GICv2 190 Level eth0 46: 0 0 0 0 GICv2 175 Level PCIe PME, aerdrv 47: 14371 0 0 0 BRCM STB PCIe MSI 524288 Edge eth1 IPI0: 2032 2198 2114 2137 Rescheduling interrupts IPI1: 20282 17235 41603 32947 Function call interrupts IPI2: 0 0 0 0 CPU stop interrupts IPI3: 0 0 0 0 CPU stop (for crash dump) interrupts IPI4: 0 0 0 0 Timer broadcast interrupts IPI5: 7550 9874 3154 7590 IRQ work interrupts IPI6: 0 0 0 0 CPU wake-up interrupts Err: 0
Passo 8
Com todos os softwares instalados, é possível agora ativar o QoS/SQM.
Acesse a aba do menu “Network” e selecione a opção:
SQM QoS
Agora marque a caixa com o escrito:
Enable this SQM instance.
Em interface name, precisamos selecionar nossa interface WAN. No meu exemplo, minha WAN está em eth0. Então vou selecionar:
eth0
Agora precisamos configurar o “ingress” e “egress” shaping. Basicamente é definir as velocidades da nossa internet. É aqui que precisamos realizar os ajustes finos, por exemplo, se minha internet possui 750Mbps de Download, uma boa janela para definir o “ingress shaping” (download) é algo em torno de 80 a 95% da velocidade média. Vamos começar com algo próximo a 95% da minha velocidade total, então vou configurar o “ingress shaping” para:
700000
Para o “egress” shaping (upload), vou seguir com a mesma metodologia. Tenho em média 370Mbps de velocidade de download. Então vou colocar algo próximo de 95% da mesma. Vou colocar meu “egress shaping” com o valor de:
350000
Agora precisamos verificar as configurações na aba:
Queue Discipline
Por padrão, o Queueing discipline vem selecionado com o algoritmo cake. Não vamos realizar modificações, pois o Raspberry Pi 4 tem processamento suficiente para este algoritmo, com esta banda de internet.
Também vamos deixar o queue setup script com o “piece_of_cake.qos”. Que é o padrão da instalação.
É interessante você verificar o algoritmo que atenda melhor sua demanda, caminhamos por estas opções apenas para evidenciar as escolhas.
Vamos agora selecionar a aba:
Link Layer Adaptation
Na primeira opção, devemos selecionar a tecnologia de link layer que vamos utilizar. Vou utilizar a opção:
Ethernet with overhead…
No campo de textfield de Per Packed Overhead (bytes) para minha internet de fibra, vou selecionar o valor de:
44
Agora vamos clicar no botão:
Salvar e Aplicar
Passo 9
Tudo pronto, agora precisamos verificar os resultados e realizar o setup fino.
Acesse novamente a página de teste de bufferbloat:
https://www.waveform.com/tools/bufferbloat
Realize o teste e verifique qual a latência atingida em “Download Active” e “Upload Active”. O ideal é ficar com algo próximo de 0 de latência, para conseguir nota A+. Caso ainda tenha recebido latência, não tem problema, será necessário realizar ajustes finos.
O ajuste fino nada mais é que ir na página “Network”->”SQM QoS” e realizar mudanças no “ingress” e “egress shaping”. Vá diminuindo os valores e realizando testes até conseguir uma latência em “Download” e “Upload Active” igual a zero. Lembre-se de salvar e aplicar as mudanças, toda vez que alterar os valores.
Se sua internet sofrer muitas variações de velocidade durante o dia, é recomendado colocar o ingress e egress shaping na casa dos 80% da velocidade média.
Tudo certo! Problemas de bufferbloat foram mitigados em nossa rede!
Conlusões
Este tutorial abordou uma forma de resolver problemas de bufferbloat que podem afetar uma rede doméstica. Existem diversas outras parametrizações que podem ser realizadas, a fim de maximizar o potencial da rede, além de outros algoritmos de SQM/QoS que podem ser utilizados. Mas as configurações padrão são também eficientes de forma geral.
Espero que tenham gostado deste passo a passo! Qualquer dúvida ou sugestão, basta escrever nos comentários!