Controle de Banda com HTB
Publicado em 13 de janeiro de 2004
O Carlos Virgílio Beltrão Lessa (lessacarlos@ig.com.br) mandou um excelente artigo sobre o controle de banda usando o recurso HTB do kernel do Linux, e seu utilitário associado "tc". Uma versão resumida e condensada deste mesmo artigo dele foi publicada recentemente pela revista PC Master. Com as técnicas expostas pelo Carlos, é possível atribuir prioridades no uso da conexão de rede para determinados serviços, impedindo que o tráfego web se sobreponha ao do banco de dados, ou que o BitTorrent se sobreponha à web, por exemplo. Controle de Banda com HTB por Carlos Virgílio Beltrão Lessa (lessacarlos@ig.com.br) Sendo você um administrador de rede, pode estar vivendo a situação onde no mesmo link estão trafegando dados vitais para empresa, lazer dos funcionários e até mesmo pacotes enviados por vírus de rede, e quando alguém resolve fazer download de um filme ou sintoniza uma rádio on-line as aplicações de missão crítica são seriamente prejudicadas. Uma das maneiras de resolver o problema é através do controle de banda, onde você pode definir uma hierarquia do uso de rede, privilegiando algumas portas TCP e UDP e/ou endereços de hosts e de redes, fornecendo a estes maior largura de banda em detrimento do tráfego menos importante. Para fazer este controle existem equipamentos dedicados a este serviço. Uma outra alternativa, de baixo custo e de grande flexibilidade, é através do Linux. É desta opção que irei falar neste artigo. Quando o kernel do linux tem de enviar para a rede vários pacotes através de um dispositivo de rede qualquer, ele precisa decidir quais enviará primeiro, quais retardará e quais descartará. Utilizando diversos algoritmos o escalonador de pacotes do kernel procura executar esta tarefa da maneira mais equilibrada possível. A regra padrão para o escalonador de pacotes é a FIFO (Firs In, First Out) - o primeiro a chegar é o primeiro a ser enviado. Você pode alterar este comportamento padrão fazendo com que o escalonador envie pacotes da maneira que lhe for mais útil. O kernel do linux oferece diversos recursos que permitem o total controle no envio de pacotes. Este conjunto de recursos é denominado Queueing Discipline (qdisc) - algo como regras de enfileiramento. Dentre estas regras existe uma denominada Hierarchical Token Bucket - HTB. O objetivo deste artigo é passar para você o funcionamento básico do HTB e como este pode lhe ajudar no controle do tráfego na rede. O HTB fornece meios para você controlar o tráfego de saída em um link. Através dele você pode simular vários links lentos em um único link físico e estabelecer quais tipos de tráfegos vão transitar em cada um destes links virtuais. O que você precisa fazer é definir a divisão em links e decidir como os pacotes neles trafegarão. Para utilizar o HTB você vai precisar de: Você pode está se perguntando se o kernel de seu linux tem suporte para HTB. Para assegurar-se disto vá para /lib/modules/versao_do_kernel/kernel/net/sched e verifique a existência dos arquivos sch_htb.o, sch_sfq.o e cls_u32.o. Se você localizar TODOS os arquivos citados seu sistema suporta o HTB. Nos testes que fiz utilizei as versões 7, 8 e 9 do Conectiva Linux. Esta última versão tem suporte para HTB. Se você é usuário das versões anteriores da Conectiva e não quer baixar os fontes mais atuais do kernel e compilá-lo, você pode instalar o kernel 2.4.21 disponível nos CDs do Conectiva Linux 9, inclusos na edição 77 da PCMaster, neste caso tenha cuidado para não substituir o kernel do seu sistema e sim instalar um novo kernel - se for instalar via linha de comando execute rpm -ivh e não rpm -Uvh - a não ser que seja exatamente isto que você quer. Independente da forma de atualização escolhida, configure seu carregador de boot e reinicie o sistema no novo kernel. É importante dizer que o HTB funciona com qualquer Linux. Você pode usá-lo na distribuição de sua preferência. Mencionei algumas vezes o Conectiva Linux porque é este que utilizo e foi nele onde executei os testes. Só falta obter a ferramenta tc atualizada para suportar HTB. Baixe o arquivo http://luxik.cdi.cz/~devik/qos/htb/v3/htb3.6-020525.tgz, descompacte-o com tar zxvf htb3.6-020525.tgz e copie o tc para /sbin. Imagine o cenário onde você tem um link de 512kbit/s entre a matriz e a filial de uma empresa. A matriz tem conexão com a Internet de 2Mbit/s e compartilha este link com a filial, ou seja, todo acesso a Internet feito pela filial trafega também pelo link de 512kbit/s. Todos os servidores estão na matriz e as aplicações vitais para a empresa estão nestes servidores. Entre estas aplicações existe também uma ordem de importância, onde as de missão crítica atendem nas portas tcp 8800 e 22, logo abaixo a que atende na porta 8080, em seguida a que atende na porta 8008 e por último a que atende na porta 8000. Todos os demais tráfegos são irrelevantes. Como você pode observar o tráfego entre a Internet e a filial concorre com o tráfego entre a filial e a matriz e o problema é agravado pela superioridade de banda da Internet em relação a conexão matiz/filial. Esta situação torna a comunicação da filial com as aplicações vitais bastante vunerável a um tráfego mais intenso com a Internet. Para que o tráfego entre a matriz (rede 192.168.0.0/24) e a filial (rede 192.168.1.0/24) fique adequada as necessidades da empresa configurei o HTB para garantir 272kbit/s nas portas 22 e 8800, 128kbit/s na porta 8080, 64kbit/s na porta 8008 e 32kbit/s na porta 8000. Os 16kbit/s restantes são destinados para assegurar uma largura de banda mínima para todo tráfego restante. Qualquer excedente de banda poderá ser utilizado por qualquer tráfego até o limite de 512kbit/s. Vamos agora examinar o script com os comandos necessários para fazer esta configuração. Os comentários estão sempre após os comandos.
Após executar o script, para assegurar que o ajuste no tráfego de rede reflita realmente aquilo que você deseja é interessante proceder alguns testes antes de colocá-lo em ambiente de produção. Sugiro que você habilite o apache, na mesma máquina onde o HTB está configurado, para aceitar conexões nas portas acima referenciadas. Isto pode ser feito acrescentando quatro linhas no arquivo httpd.conf (normalmente em /etc/httpd/conf) com as seguintes instruções: Listen 8800, Listen 8080, Listen 8008 e Listen 8000. Não esqueça de reiniciar o apache com o comando /etc/init.d/httpd restart. Coloque também no diretório onde ficam as páginas do apache (DocumentRoot) arquivos com tamanhos de 512 kbytes, 1024 kbytes, 2048 kbytes, 4096 kbytes e 8192 kbytes. Agora o seu ambiente de testes está pronto. Para executar os testes você vai precisar de dois computadores. O endereço ip da máquina servidora tem de estar conforme o parâmetro src do script e a máquina cliente tem de estar conforme o parâmetro dst. Caso sua rede não se assemelhe aos endereços constantes no script faça as alterações antes de testar. No cliente você pode usar qualquer programa que faça download de um servidor web, onde você possa definir a porta que o servidor está ouvindo e que mostre a taxa de transferência final dos dados. Por atender a todas a estas características utilizei o wget. O primeiro teste consiste em fazer downloads simultâneos nas portas 80 - submetida a classe 1:50 por conta do parâmetro default, 8000 - classe 1:40, 8008 - classe 1:30, 8080 - classe 1:20 e 8800 - classe 1:10.
# wget http://192.168.0.252:8000/teste/1024.gz; rm -f 1024.gz # wget http://192.168.0.252:8008/teste/2048.gz; rm -f 2048.gz # wget http://192.168.0.252:8080/teste/4096.gz; rm -f 4096.gz # wget http://192.168.0.252:8800/teste/8192.gz; rm -f 8192.gz Como você pode observar as taxas de transferência foram bastante aproximadas ao que foi configurado no script. Repare que elas estão demonstradas em Kbytes/s, para transformar em kbits/s multiplique por oito. Verifique também a hora de início e de término de cada download e o tamanho dos arquivos transferidos. Para verificar a distribuição eqüitativa dentro de uma classe baixei duas vezes o mesmo arquivo simultaneamente na porta 8800:
# wget http://192.168.0.252:8800/teste/1024.gz; rm -f 1024.gz Atente para a taxa de ambos downloads que é praticamente idêntica. O que você viu é apenas uma demonstração do potencial do HTB. Configurações muito mais complexas podem ser feitas para atender inúmeras situações. Você pode criar uma estrutura de classes HTB com diversos níveis hierárquicos ou ainda ter mais de uma classe raiz vinculada a mesma interface de rede. Como você pode comprovar o HTB é uma ferramenta poderosa e bastante flexível para controle de tráfego de rede. Dicas: O controle de banda no Linux é sempre no tráfego de saída. Se você quer controlar o fluxo de dados da filial para a matriz, por exemplo o envio de email ou upload de ftp, você precisa colocar outro computador com linux também na filial para controlar a saída dos dados de lá. Se você optar por compilar o kernel, verifique a existência de arquivos com o nome parecido com "kernel-versao_do_kernel-perfil_de_hardware.config" no diretório /usr/src/linux-versao_do_kernel_original/configs/ de seu linux. Algumas distribuições disponibilizam estes arquivos que espelham o kernel original e basta copiar um deles para o diretório dos fontes do kernel que você quer compilar com o nome .config. Escolha o arquivo que mais se assemelhe ao perfil de hardware de seu computador - número de processadores, família de processadores e quantidade de memória RAM. Desta forma é muito mais fácil e rápido do que selecionar dezenas de opções, pois quase tudo que você precisa já está no arquivo .config, afinal de contas você está partindo de um kernel que já está rodando no seu computador. Depois é só fazer as modificações que você desejar com make menuconfig ou make xconfig, não esquecendo de selecionar as opçoes de QoS pois o suporte a HTB é uma delas e em seguida executar make dep, make clean, make, make bzImage, make modules, make modules_install e finalmente make install. Lembre-se de atualizar o seu carregador de boot para poder reiniciar seu sistema com o novo kernel. Para saber mais: Sobre controle de banda com o Linux: Capitulo 9 do Linux Advanced Routing and Traffic Control HOWTO em http://lartc.org/howto/ (autor: Carlos Virgílio Beltrão Lessa - lessacarlos@ig.com.br) Postado por brain em janeiro 13, 2004 01:32 PMComentários para "Controle de Banda com HTB"
» Postado por: asfd em janeiro 13, 2004 03:31 PM, 200.103.220:
» Postado por: alguem em janeiro 13, 2004 04:17 PM, 200.198.42.:
» Postado por: verdade em janeiro 13, 2004 04:23 PM, 200.158.229:
» Postado por: marcio hugo em janeiro 13, 2004 04:27 PM, 200.165.230:
» Postado por: edu lima em janeiro 13, 2004 06:36 PM, 200.232.192:
» Postado por: ddd em janeiro 14, 2004 01:49 AM, 200.211.53.:
» Postado por: Carlos J. Vaz em janeiro 14, 2004 08:57 AM, 200.203.54.:
» Postado por: x-arnie em janeiro 14, 2004 09:18 AM, 200.210.46.:
» Postado por: Marco Máximo em janeiro 14, 2004 09:47 AM, 200.184.174:
» Postado por: risky77 em janeiro 15, 2004 09:01 AM, 200.138.220:
» Postado por: CarlosLessa em janeiro 15, 2004 02:19 PM, 200.199.64.:
» Postado por: alberto em janeiro 15, 2004 02:29 PM, 200.101.63.:
» Postado por: linuxman em janeiro 15, 2004 06:12 PM, 200.206.25.:
» Postado por: Marcelo em janeiro 16, 2004 01:14 AM, 201.2.229.4:
» Postado por: Tiago em janeiro 16, 2004 12:27 PM, 200.150.64.:
» Postado por: CarlosLessa em janeiro 16, 2004 12:55 PM, 200.199.64.:
» Postado por: Otavio Augusto em janeiro 16, 2004 02:37 PM, 200.202.250:
» Postado por: CarlosLessa em janeiro 16, 2004 03:03 PM, 200.199.64.:
» Postado por: Marcelo em janeiro 16, 2004 03:41 PM, 200.247.140:
» Postado por: gmlinux em janeiro 17, 2004 04:33 PM, 200.157.165:
» Postado por: alvaro em janeiro 17, 2004 09:49 PM, 200.167.250:
» Postado por: Fábio Brancati em janeiro 21, 2004 09:14 AM, 200.231.0.6:
» Postado por: Júlio César Arraes em março 23, 2004 11:27 AM, 200.146.155:
» Postado por: Nitronet em maio 5, 2004 08:50 AM, 200.162.7.2:
» Postado por: CRASH2k em junho 17, 2004 09:49 PM, 200.96.129.:
» Postado por: Flyer em julho 21, 2004 08:43 AM, 200.206.167:
» Postado por: online poker em agosto 15, 2004 05:05 PM, 211.138.91.:
» Postado por: play blackjack em agosto 16, 2004 08:32 PM, 24.248.106.:
» Postado por: Roberto em setembro 2, 2004 05:27 PM, 200.146.155:
» Postado por: Leandro em setembro 30, 2004 08:46 PM, 200.150.15.:
Antes de comentar...
- Preserve a qualidade desta discussão - Leia os Termos de Uso. - Este formulário deve ser usado para comentários sobre a notícia. Se você tem dúvidas ou precisa de ajuda, use o Fórum. - Mantenha o foco nos argumentos e no assunto - Não faça ataques pessoais. - Pense 5 vezes antes de entrar em discussões inúteis, como "qual é a melhor distribuição/ambiente gráfico/linguagem de programação/etc.", mesmo se alguém já tiver provocado - um erro não justifica o outro - Não seja um e-mala ;-) ![]() Envie seu comentário
|