A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Linux

Administração de Largura de Banda no Linux

Sex

20

Abr

2007


19:22

(5 votos, média 4.80 de 5) 


Filtro Balde de Token

O Token Bucket Filter (TBF) - Filtro Balde de Token - é uma qdisc simples que só passa pacotes que chegam numa taxa que não ultrapassa uma taxa determinada administrativamente, mas com a possibilidade de permitir rompimentos curtos quando houver excessos.

O TBF é muito preciso e não sobrecarrega nem a rede e nem o processador. Deveria ser a sua primeira escolha se você quiser tornar uma interface mais lenta!

A implementação do TBF consiste num buffer (o balde - bucket) que é constantemente preenchido com alguns pedaços de informação virtual chamados de tokens, numa taxa específica (a token rate). O parâmetro mais importante do balde é o seu tamanho, que é o número de tokens que ele pode armazenar.

Cada um dos tokens que chega pega um pacote de dados entrante na fila de dados e depois é deletado do balde. A associação deste algoritmo com os dois fluxos (o de tokens e o de dados) pode resultar em três cenários diferentes:

  • Os dados chegam no TBF numa taxa igual à taxa de tokens entrantes. Neste caso, cada pacote entrante possui seu token correspondente e passa pela fila sem qualquer retardo (delay).
  • Os dados chegam no TBF numa taxa que é menor que a taxa dos tokens. Apenas uma parte dos tokens são deletados quando cada um dos pacotes de dados sair da fila de modo que os tokens se acumulam e acabam lotando o balde. Os tokens que não foram usados podem ser usados para enviar dados numa velocidade que ultrapassa a taxa de token padrão, ou seja, ocorre uma rápida explosão de dados.
  • Os dados chegam no TBF numa taxa maior do que a taxa de tokens. Isto significa que o balde se esvazia rapidamente, o que faz com que o TBF fique estrangulado por um tempo. Esta é a chamada "situação acima do limite" (overlimit situation). Se os pacotes continuam entrando, eles começam a ser descartados.

O último cenário é muito importante porque permite modelar administrativamente a largura de banda disponível para atender os dados que passam pelo filtro.

O acúmulo de tokens permite que uma explosão rápida de dados acima do limite faça com que passem sem perdas, mas um excesso de carga prolongado causa atrasos persistentes nos pacotes e estes acabam sendo descartados.

É importante saber que na implementação atual do TBF, os tokens correspondem a bytes e não a pacotes.

Normalmente a configuração do TBF não precisa ser alterada, mas, mesmo assim, esta possibilidade é oferecida através dos seus parâmetros:

  • limit ou latency: Limit (limite) é o número de bytes que podem entrar na fila para esperar até que haja tokens disponíveis. Pode-se especificar isto "ao contrário" alterando o parâmetro latency (latência), o qual especifica o tempo máximo que um pacote pode ficar no TBF. Este cálculo leva em consideração o tamanho do balde, a taxa e, se estiver especificada, a taxa de pico (peakrate).
  • burst/buffer/maxburst: Tamanho do balde em bytes. Esta é a quantidade máxima de bytes para os quais deve haver tokens disponíveis instantaneamente. Em geral, taxas mais altas requerem um buffer maior. Para 10mbit/s em processadores Intel será preciso um buffer de, no mínimo, 10kbyte para suportar a taxa configurada!
    Se o buffer for muito pequeno, os pacotes podem ser descartados porque chegam mais tokens do que cabem no buffer por ciclo de timer.
  • mpu: Um pacote de tamanho zero também usa largura de banda. Para uma Ethernet, nenhum pacote usa menos do que 64 bytes. A Minimum Packet Unit - Unidade de Pacote Mínima determina a utilização de token mínima para um pacote.
  • rate: O acelerador. Veja os comentários acima sobre limites!

Se o balde contiver tokens e tiver permissão para ser esvaziado, ele faz isto numa velocidade infinita por default. Se isto não for aceitável, use os seguintes parâmetros:

  • peakrate (taxa de pico): Se chegarem pacotes e houver tokens disponíveis, por default os pacotes são despachados instantaneamente - por assim dizer, na "velocidade da luz". Isto pode não ser o que você deseja, especialmente se o balde for grande.
    A taxa de pico pode ser usada para especificar a velocidade permitida de esvaziamento do balde. Se fizermos tudo de acordo com o manual, isto pode ser obtido liberando um pacote e depois esperar um certo tempo para liberar o seguinte. Se calculamos as esperas, então é só enviar na taxa de pico.
    Entretanto, devido à resolução default de 10ms do timer no Unix, com pacotes de 10.000 bits em média estaremos limitados a uma taxa de pico de 1mbit/s!
  • mtu/minburst: A taxa de pico de 1mbit/s não serve para muita coisa se a taxa normal for mais alta. Uma taxa de pico mais alta torna possível despachar mais pacotes por ciclo do timer (timertick), o que, na realidade, significa a criação de um segundo balde!
    O segundo balde serve para apenas um pacote, o que não chega a ser um balde.
    Para calcular a taxa de pico mais alta possível, multiplique a mtu configurada por 100 (ou, mais corretamente, HZ, que é 100 no Intel e 1024 no Alpha).

Exemplo de configuração

Uma configuração *muito* simples mas muito útil é:

# tc qdisc add dev ppp0 root tbf rate 220kbit latency 50ms burst 1540

Muito bem, porque isto é útil? Se você tiver um dispositivo de rede com uma fila grande (por exemplo um modem DSL ou modem a cabo) e quiser "falar" com ele através de um dispositivo rápido (uma interface Ethernet, por exemplo), vai descobrir que o upload destrói toda a interatividade.

Isto acontece porque o upload vai entupir a fila do modem. Esta fila provavelmente é gigantesca para permitir um bom fluxo de dados para o upload. Mas não é isto o que queremos, o que desejamos é uma fila menor para preservar a interatividade e poder realizar outras tarefas enquanto enviamos dados.

A linha acima diminui a velocidade de envio para uma taxa que não aciona a fila no modem - a fila estará no Linux, onde podemos controlá-la limitando seu tamanho.

Altere a velocidade efetiva do seu uplink para 220kbit menos uma pequena porcentagem. Se você tiver um modem realmente rápido, aumente um pouco o 'burst'.

Informações adicionais