Dispositivo de Enfileiramento Intermediário :: Admirável Mundo Novo




Muito Bem Vindo

Prezado Leitor, a proposta desse Blog é compartilhar conhecimento com as pessoas que trabalham com Linux, Asterisk, OpenSER, e com tecnologia de voz sobre a rede IP em geral, através de tutoriais, dicas, howto, notícias entre outros assuntos.

Atente para termo de uso do conteúdo do blog no rodapé da página.

sábado, 3 de janeiro de 2009

Dispositivo de Enfileiramento Intermediário




9.7. O Dispositivo de Enfileiramento Intermediário (IMQ)

O dispositivo de enfileiramento intermediário não é uma qdisc, mas seu uso é fortemente limitado em qdiscs. Dentro do Linux, qdiscs são amarradas aos dispositivos de rede e tudo que é enfileirado para o dispositivo é primeiro enfileirado na qdisc. A partir desse conceito, duas limitações aparecem:

1. Somente o tratamento de tráfego egress com vista à sua priorização é possível (existe uma qdisc ingress, mas suas possibilidades são muito limitadas se comparada com as qdiscs classful).

2. Uma qdisc pode ver somente o tráfego de uma interface, limitações globais não podem ser colocadas.

O IMQ existe para ajudar a resolver essas duas limitações. Resumidamente, você pode colocar tudo que você escolher em uma qdisc. Especialmente pacotes marcados são interceptados pelas iscas NF_IP_PRE_ROUTING e NF_IP_POST_ROUTING do netfilter e atravessa a qdisc associada a um dispositivo imq. Um alvo do iptables é usado para marcar os pacotes.

Isso permite a você fazer o tratamento do tráfego ingress da mesma forma como você pode marcar apenas pacotes entrantes de algum lugar e/ou tratar interfaces como classes para definir limites globais. Você pode também fazer um monte de outras coisas como simplesmente colocar seu tráfego HTTP em uma qdisc, e colocar novas requisições de conexão em uma outra qdisc,...


9.7.1. Configuração Exemplo

A primeira coisa que pode vir à tona é usar a shape-agem do tráfego ingress para lhe permitir uma largura alta de banda garantida ;-)


A configuração é justamente igual a qualquer outra interface:

tc qdisc add dev imq0 root handle 1: htb default 20

tc class add dev imq0 parent 1: classid 1:1 htb rate 2mbit burst 15k

tc class add dev imq0 parent 1:1 classid 1:10 htb rate 1mbit
tc class add dev imq0 parent 1:1 classid 1:20 htb rate 1mbit

tc qdisc add dev imq0 parent 1:10 handle 10: pfifo
tc qdisc add dev imq0 parent 1:20 handle 20: sfq

tc filter add dev imq0 parent 10:0 protocol ip prio 1 \
u32 match ip dst 10.0.0.230/32 flowid 1:10


Nesse exemplo, o u32 é usado para classificação. Outros classificadores funcionariam como esperado. O tráfego seguinte precisa ser selecionado e marcado para ser enfileirado em imq0.

iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0

ip link set imq0 up


Os alvos IMQ do iptables são válidos nas chains PREROUTING e POSTROUTING da tabela mangle. Sua sintaxe é

IMQ [ --todev n ]       n : número do dispositivo imq


Um alvo ip6tables é também fornecido.

Favor observe que o tráfego não é enfileirado quando o alvo é alcançado, mas atrasado. O local exato onde o tráfego entra no dispositivo imq depende da direção do tráfego (entrante/sainte). Essas são as iscas predefinidas do netfilter usados pelo iptables:


enum nf_ip_hook_priorities {
NF_IP_PRI_FIRST = INT_MIN,
NF_IP_PRI_CONNTRACK = -200,
NF_IP_PRI_MANGLE = -150,
NF_IP_PRI_NAT_DST = -100,
NF_IP_PRI_FILTER = 0,
NF_IP_PRI_NAT_SRC = 100,
NF_IP_PRI_LAST = INT_MAX,
};


Para o tráfego ingress, o imq registra-se com prioridade NF_IP_PRI_MANGLE + 1 o que significa que os pacotes entram no dispositivo imq diretamente após ter atravessado a chain PREROUTING da tabela mangle.

Para o tráfego egress, o imq usa NF_IP_PRI_LAST que honra o fato de que pacotes descartados pela tabela filter não ocupariam largura de banda.

Os patches e algumas informações podem ser encontrados no site do imq.




Alguns Links para leitura complementares:
http://www.rnp.br/newsgen/0201/roteamento_linux.html;
http://linuxflex.blogspot.com/2008/02/controle-de-trfego.html;
http://www.numaboa.com/informatica/linux/configuracoes/703-roteamento-linux;
http://ornellas.apanela.com/dokuwiki/pub:pt-br:linuxfwrt;
http://www.vivaolinux.com.br/artigo/Controle-de-trafego-utilizando-HTB-no-Debian-Sarge/?pagina=5;
http://eriberto.pro.br/wiki/index.php?title=Controle_de_tr%C3%A1fego_com_TC%2C_HTB_e_Iptables;
http://www.howtoforge.com/voip_qos_traffic_shaping_iproute2_asterisk;
http://br-linux.org/tutoriais/001648.html;
http://gpwm.devin.com.br/index.php/QoS_para_VoIP_atrav%C3%A9s_do_HTB;
http://www.xjulio.info/blog/limitando-a-banda-no-linux-usando-o-shaper-e-cbq;
http://academicos.cefetmg.br/admin/downloads/2062/cbq.htm;
http://linuxold.net/modules.php?name=News&file=article&sid=11;
http://www.pcforum.com.br/cgi/yabb/YaBB.cgi?board=apache;action=display;num=1088299010;
http://meumaravilhosomundolivre.blogspot.com/2009/02/usando-htb-para-controle-de-trafego-por.html.











Autores Originais dos textos:

Bert Hubert (Netherlabs BV)
bert.hubert@netherlabs.nl

Thomas Graf (Autor de Seção)
tgraf@suug.ch

Gregory Maxwell (Autor de Seção)
greg@linuxpower.cx

Remco van Mook (Autor de Seção)
remco@virtu.nl

Martijn van Oosterhout (Autor de Seção)
kleptog@cupid.suninternet.com

Paul B Schroeder (Autor de Seção)
paulsch@us.ibm.com

Jasper Spaans (Autor de Seção)
jasper@spaans.ds9a.nl

Pedro Larroy (Autor de Seção)
piotr@member.fsf.org









Nenhum comentário:




Creative Commons License
Admirável Mundo Novo: Tudo Sobre Asterisk, OpenSER, Linux e Tecnologias de Voz sobre IP
by Cléviton Mendes de Araújo is licensed under a Creative Commons Atribuição 2.5 Brasil License.