Conceitos avançados de Networking: [02] Implementando a qualidade de serviço (QoS)
Nem todo o tráfego é estabelecido igualmente e nem todos os serviços tem a mesma importância, com alguns exigindo mais ou menos urgência. Em um ambiente de servidor, um banco de dados MySQL requisite mais tráfego de dados do que o restante de outras aplicações, ou talvez você use VoIP que necessita de maior prioridade no sistema de um smartphone. Há muitas razões porque sua rede exiga um serviço ser tratado com mais urgência que outros. A Qualidade de Serviço (QoS) ajuda a obter isso.
Enquanto há múltiplas maneiras de ajustar adaptadores de rede para usar QoS, a maneira mais comum é conhecida como disciplina de enfileiramento (ou simplesmente, qdisc). Uma disciplina de enfileiramento é algo que um administrador pode aplicar em um adaptador de rede para usar múltiplos agendamentos, cada com efeitos diversos dependendo da gerência do tráfego. Para visualizar como o adaptador de rede está atualmente sendo usado é necessário executar o seguinte comando:
ip link list
Cheque a placa de rede padrão, que geralmente será eth0 (Debian / Fedora) ou eno1 (CentOS), ou algo similar.
Visualizando a saída da lista de links no Debian
Geralemente será mostrado qdisc pfifo_fast na saída, que diz que a disciplina de enfileiramento atualizamento está usando pfifo_fast, que é basicamente o agendador primeiro-que-chega é o primeiro-a-ser-atendido (do inglês first in, first out [FIFO]). Mas ao invés de conter uma única banda, pfifo_fast contém três - cada uma separando o tráfego em três prioridades. A primeira banda (band 0) contém o tráfego com prioridade mais alta. Cada banda é gerenciada somente após as anteriores terem sido atendidas. A menos que isso tenha sido alterado pela distribuição Linux utilizada, será a que a que estará em uso pelo sistema.
O agendador pfifo_fast é conhecido como um agendador sem classes. Em outras palavras, o que você consegue visualizar é o que você tem (que possue sigla em inglês: WYCSIWYG), não sendo necessária nenhuma configuração para que o filtro de tráfego ocorra como o esperado. Outras disciplinas de enfileiramento sem classes incluem: Stochastic Fair Queuing (SFQ), Extended Stochastic Fair Queuing (ESFQ) e Token Bucket Filter (TBF).
O SFQ qdisc usa o conceito FIFO mencionado anteriormente, mas separa o tráfego em mais que um FIFO, gerenciado em um esquema round-robin. O qdisc busca ser o mais justo possível, usando fluxos para agendar a transmissão de pacotes. Isso concede a cada serviço um turno de transmissão, prevenindo que qualquer um deles fique saturado. ESFQ é similar, mas possui mais opções de configuração. Ao contrário do SFQ, o TBF não manipula pacotes nem faz qualquer agendamento. O principal propósito do TBF é configurar uma taxa na qual a transmissão ocorrerá, permitindo que sejam definidos parâmetros, tais como: taxa, estouro, pico de taxas, e afins. Para mais informações é só acessar as páginas dos manuais do sfq (para acessar clique aqui) e do tbf (para acessar clique aqui).
Configurando o qdisc escolhido no adaptador de rede é feito via o comando tc. Veja o exemplo seguinte para configurar o sfq no adaptador Ethernet eth0:
# tc qdisc add dev eth0 root sfq perturb 60
O comando tc é chamado com qdisc e deixando evidente que será adicionada uma qdisc. Ela será executada na interface etho, e a requisição para sair (root) enquanto seleciona o qdisc sfq para aquela interface. O parâmetro perturb a quantidade em segundos na qual o algoritmo de divisão fará o reset para esse qdisc. Há outros valores específicos do sfq que podem ser alterados, tais como o números de fluxos usados, quantum, redflowlimit, e outros que são listados no manual do sfq.
Esse tipo de conceito, no entanto, não permite definir qual tipo de tráfego recebe prioridade maior em dado momento. Disciplinas de enfileiramento com classes removem esse problema, e concedem maior flexibilidade, já que é possível definir pais e filhos, com diferentes regras, sendo essa a diferença primária entre qdisc sem e com classes. E não é que qdisc sem classe não tenham opções desse gênero, mas não suportam quase nenhuma flexibilidade em casos de uso avançados. A seguir serão explorados qdisc com classes e como elas podem permitir maior flexbilidade.
Ao utilizar qdisc com classes maior controle sobre o gerenciamento dos pacotes é garantido, já que as classes atuam como filtros.
Um cenário possível é a instabilidade de tráfego de VoIP, fazendo com que a chamada fique falhada ou caia. Nesse caso, garantir mais banda ao servidor VoIP é adequado. No entanto, se o servidor está sobrecarregado com a quantidade de pacotes a ponto de não conseguir responder a uma conexão SSH, isso pode ser um problema grande já que irá impossibilitar o login e nem corrigir qualquer problema que venha a ocorrer na conexão.
O qdisc mais popular para oter isso é o Hierarchical Token Bucket (HTB), que permite controlar a banda que sai de um dispositivo, e é baseado no TBF discutido anteriormente. HTB usa um número de classes que permite definir o pai, prioridade, taxa padrão, taxa limite, e o número de bytes excedentes para estouro. Acesso o manual do htb (para acessar clique aqui) é possível ver uma lista completa.
A classificação da classe é feita pelo comando tc. Na maioria dos sistemas, esse comando é armazenado em /sbin e usualmente não é encontrado no diretório padrão. Na maioria dos casos é reconhecido quando logado com o usuário root. Abaixo segue um exemplo do processo usando o HTB em um dispoitivo de rede com nome eth0:
# tc qdisc add dev eth0 root handle 1: htb default 10
# tc class add dev eth0 parent 1: classid 1:1 htb rate 2mbit
# tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1.5mbit
# tc class add dev eth0 parent 1:1 classid 1:20 htb rate 100kbps ceil 100kbps
No primeiro comando, o qdisc é mudado de pfifo_fast para htb, usando o root para obter controle do trafégo que sai dos dispositivos. O manejamento de 1: é um nome para a instância, e 10 o máximo de classes, nesse caso, classe 1 de 10 (1:10).
No segundo comando, é a classe 1:1 criada com a taxa limite de 2MB. Como são 10 classes ao todo, a configuração só afeta essa.
No terceiro comando, está sendo criada outra classe, com uma taxa limite da classe de 1.5MB, e 1MB de taxa disponível para cada serviço.
No quarto comando, foi criada uma terceira classe, de um total de 20, que tem um limite muito menor, de 100KB, tanto para a classe, como para cada serviço.
O próximo passo é utilizar alguma das classes para algum serviço. Como o SSH não requer tanta banda, nesse exemplo será configurada direcionada à ele. Usando-se o seguinte comando:
# tc filter add dev eth0 parent 1: protocol ip prio 7 u32 match ip sport 22 0xfff classid 1:20
Caso queira alterar a porta utilizada pelo SSH, e ainda não saiba, clique aqui para avançar ao tutorial aonde isso é demonstrado. Caso tenha sido alterada, só é necessário ajustar o comando tc.
O que mantém duas classes, 1:1 and 1:10, nas quais filtros podem ser utilizados, dependendo como deseja-se modelar o tráfego de dados:
# tc filter add dev eth0 parent 1: u32 match ip sport 80 0xfff classid 1:1
# tc filter add dev eth0 parent 1: u32 match ip sport 5060 0xfff classid 1:10
Nesse exemplo foram usadas as portas 80 e 5060 para o HTTP e o VoIP, respectivamente. Sendo que o tráfego na porta 80 foi classificado com a classe 1:1 e concedido uma taxa máxima de 2MB, e o tráfego pela porta 5060 definido em 1.5MB.
Em resumo, qdisc sem classes permite controlar de forma geral como os pacotes são gerenciados no sistema, e garantem maior performance. No entanto, o benefício de um controle granular alto sobre os pacotes pode ser feito usado qdisc com classes. Uma avaliação de qual será mais adequado para uma rede em particular pode consumir um bom tempo e requer várias tentativas até determinar valores, classes e filtor que irão aumentar a performance da rede.
No próximo tutorial será demonstado como fazer o roteamento do tráfego TCP/IP entre interfaces. Para avançar clique aqui.
Enquanto há múltiplas maneiras de ajustar adaptadores de rede para usar QoS, a maneira mais comum é conhecida como disciplina de enfileiramento (ou simplesmente, qdisc). Uma disciplina de enfileiramento é algo que um administrador pode aplicar em um adaptador de rede para usar múltiplos agendamentos, cada com efeitos diversos dependendo da gerência do tráfego. Para visualizar como o adaptador de rede está atualmente sendo usado é necessário executar o seguinte comando:
ip link list
Cheque a placa de rede padrão, que geralmente será eth0 (Debian / Fedora) ou eno1 (CentOS), ou algo similar.
Visualizando a saída da lista de links no Debian
Geralemente será mostrado qdisc pfifo_fast na saída, que diz que a disciplina de enfileiramento atualizamento está usando pfifo_fast, que é basicamente o agendador primeiro-que-chega é o primeiro-a-ser-atendido (do inglês first in, first out [FIFO]). Mas ao invés de conter uma única banda, pfifo_fast contém três - cada uma separando o tráfego em três prioridades. A primeira banda (band 0) contém o tráfego com prioridade mais alta. Cada banda é gerenciada somente após as anteriores terem sido atendidas. A menos que isso tenha sido alterado pela distribuição Linux utilizada, será a que a que estará em uso pelo sistema.
O agendador pfifo_fast é conhecido como um agendador sem classes. Em outras palavras, o que você consegue visualizar é o que você tem (que possue sigla em inglês: WYCSIWYG), não sendo necessária nenhuma configuração para que o filtro de tráfego ocorra como o esperado. Outras disciplinas de enfileiramento sem classes incluem: Stochastic Fair Queuing (SFQ), Extended Stochastic Fair Queuing (ESFQ) e Token Bucket Filter (TBF).
O SFQ qdisc usa o conceito FIFO mencionado anteriormente, mas separa o tráfego em mais que um FIFO, gerenciado em um esquema round-robin. O qdisc busca ser o mais justo possível, usando fluxos para agendar a transmissão de pacotes. Isso concede a cada serviço um turno de transmissão, prevenindo que qualquer um deles fique saturado. ESFQ é similar, mas possui mais opções de configuração. Ao contrário do SFQ, o TBF não manipula pacotes nem faz qualquer agendamento. O principal propósito do TBF é configurar uma taxa na qual a transmissão ocorrerá, permitindo que sejam definidos parâmetros, tais como: taxa, estouro, pico de taxas, e afins. Para mais informações é só acessar as páginas dos manuais do sfq (para acessar clique aqui) e do tbf (para acessar clique aqui).
Configurando o qdisc escolhido no adaptador de rede é feito via o comando tc. Veja o exemplo seguinte para configurar o sfq no adaptador Ethernet eth0:
# tc qdisc add dev eth0 root sfq perturb 60
O comando tc é chamado com qdisc e deixando evidente que será adicionada uma qdisc. Ela será executada na interface etho, e a requisição para sair (root) enquanto seleciona o qdisc sfq para aquela interface. O parâmetro perturb a quantidade em segundos na qual o algoritmo de divisão fará o reset para esse qdisc. Há outros valores específicos do sfq que podem ser alterados, tais como o números de fluxos usados, quantum, redflowlimit, e outros que são listados no manual do sfq.
Esse tipo de conceito, no entanto, não permite definir qual tipo de tráfego recebe prioridade maior em dado momento. Disciplinas de enfileiramento com classes removem esse problema, e concedem maior flexibilidade, já que é possível definir pais e filhos, com diferentes regras, sendo essa a diferença primária entre qdisc sem e com classes. E não é que qdisc sem classe não tenham opções desse gênero, mas não suportam quase nenhuma flexibilidade em casos de uso avançados. A seguir serão explorados qdisc com classes e como elas podem permitir maior flexbilidade.
Ao utilizar qdisc com classes maior controle sobre o gerenciamento dos pacotes é garantido, já que as classes atuam como filtros.
Um cenário possível é a instabilidade de tráfego de VoIP, fazendo com que a chamada fique falhada ou caia. Nesse caso, garantir mais banda ao servidor VoIP é adequado. No entanto, se o servidor está sobrecarregado com a quantidade de pacotes a ponto de não conseguir responder a uma conexão SSH, isso pode ser um problema grande já que irá impossibilitar o login e nem corrigir qualquer problema que venha a ocorrer na conexão.
O qdisc mais popular para oter isso é o Hierarchical Token Bucket (HTB), que permite controlar a banda que sai de um dispositivo, e é baseado no TBF discutido anteriormente. HTB usa um número de classes que permite definir o pai, prioridade, taxa padrão, taxa limite, e o número de bytes excedentes para estouro. Acesso o manual do htb (para acessar clique aqui) é possível ver uma lista completa.
A classificação da classe é feita pelo comando tc. Na maioria dos sistemas, esse comando é armazenado em /sbin e usualmente não é encontrado no diretório padrão. Na maioria dos casos é reconhecido quando logado com o usuário root. Abaixo segue um exemplo do processo usando o HTB em um dispoitivo de rede com nome eth0:
# tc qdisc add dev eth0 root handle 1: htb default 10
# tc class add dev eth0 parent 1: classid 1:1 htb rate 2mbit
# tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1.5mbit
# tc class add dev eth0 parent 1:1 classid 1:20 htb rate 100kbps ceil 100kbps
No primeiro comando, o qdisc é mudado de pfifo_fast para htb, usando o root para obter controle do trafégo que sai dos dispositivos. O manejamento de 1: é um nome para a instância, e 10 o máximo de classes, nesse caso, classe 1 de 10 (1:10).
No segundo comando, é a classe 1:1 criada com a taxa limite de 2MB. Como são 10 classes ao todo, a configuração só afeta essa.
No terceiro comando, está sendo criada outra classe, com uma taxa limite da classe de 1.5MB, e 1MB de taxa disponível para cada serviço.
No quarto comando, foi criada uma terceira classe, de um total de 20, que tem um limite muito menor, de 100KB, tanto para a classe, como para cada serviço.
O próximo passo é utilizar alguma das classes para algum serviço. Como o SSH não requer tanta banda, nesse exemplo será configurada direcionada à ele. Usando-se o seguinte comando:
# tc filter add dev eth0 parent 1: protocol ip prio 7 u32 match ip sport 22 0xfff classid 1:20
Caso queira alterar a porta utilizada pelo SSH, e ainda não saiba, clique aqui para avançar ao tutorial aonde isso é demonstrado. Caso tenha sido alterada, só é necessário ajustar o comando tc.
O que mantém duas classes, 1:1 and 1:10, nas quais filtros podem ser utilizados, dependendo como deseja-se modelar o tráfego de dados:
# tc filter add dev eth0 parent 1: u32 match ip sport 80 0xfff classid 1:1
# tc filter add dev eth0 parent 1: u32 match ip sport 5060 0xfff classid 1:10
Nesse exemplo foram usadas as portas 80 e 5060 para o HTTP e o VoIP, respectivamente. Sendo que o tráfego na porta 80 foi classificado com a classe 1:1 e concedido uma taxa máxima de 2MB, e o tráfego pela porta 5060 definido em 1.5MB.
Em resumo, qdisc sem classes permite controlar de forma geral como os pacotes são gerenciados no sistema, e garantem maior performance. No entanto, o benefício de um controle granular alto sobre os pacotes pode ser feito usado qdisc com classes. Uma avaliação de qual será mais adequado para uma rede em particular pode consumir um bom tempo e requer várias tentativas até determinar valores, classes e filtor que irão aumentar a performance da rede.
No próximo tutorial será demonstado como fazer o roteamento do tráfego TCP/IP entre interfaces. Para avançar clique aqui.
Comentários
Postar um comentário