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:

  1. Realizar teste de velocidade da rede em vários momentos do dia, para ter uma média de velocidade de download e upload
  2. Realizar o teste de BufferBloat e verificar o estado da rede
  3. Habilitar packet steering, qos/sqm e irqbalance no OpenWRT
  4. Configurar as métricas do QoS/SQM
  5. Testar novamente a rede para verificar o estado do Bufferbloat
  6. 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).

Bufferbloat - speedtest sem ligar QoS QSM Packet Sterring e irqbalance

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.

Bufferbloat - Teste sem habilitar QoS QSM Packet Steering e irqbalance

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

OpenWRT - Tela de login

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

OpenWRT - pagina network - interfaces
OpenWRT - pagina interfaces
OpenWRT - pagina network - interfaces - global network options

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.

OpenWRT - Menu para página system - software
OpenWRT - Página instalação de softwares

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.

OpenWRT - busca para instalar luci-app-sqm
OpenWRT - busca para instalar luci-sqm-scripts

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…

OpenWRT - Página de instalação de software, busca por irqbalance

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.

OpenWRT - Menu System - Startup
OpenWRT - verificar os processos em startup do sistema
OpenWRT - Menu System - Processes
OpenWRT - verificar os processos funcionamento - irqbalance

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

OpenWRT - ssh roteador openwrt
OpenWRT - ssh roteador openwrt - logado
OpenWRT - editar arquivo de configuração irqbalance
OpenWRT - arquivo de configuração irqbalance editadoOpenWRT - start irqbalance service
OpenWRT - iniciar serviço irqbalanceBufferbloat - IRQbalance em funcionamento: cat /proc/interrupts

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

OpenWRT - Menu SQM/QoS

OpenWRT - Página QoS SQM - definir wan e habilitar qos/sqm

OpenWRT - Página QoS SQM - definir velocidade da rede e ingress egress shaping

OpenWRT - Página QoS SQM - algoritmo cake utilizado

OpenWRT - Página QoS SQM - script piece of cake utilizado

OpenWRT - Página QoS SQM -definir link layer e packet overhead

OpenWRT - Página QoS SQM -salvar e aplicar as mudanças

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!

OpenWRT - Bubberbloat resolvido utilizando QoS QSM Packet Steering e IRQbalance

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!