Mecanismos de QoS em Linux tc – Traffic Control Edgard Jamhour Edgard Jamhour Controle de Tráfego (TC) Elementos do TC Camadas Superiores (TCP, UDP) S Interface de Entrada Destino é Interno? N Rotamento Policiamento Classificação Enfileiramento na Saída Escalonamento Formatação de Tráfego Interface de Saída Edgard Jamhour Política de QoS e Elementos do TC Qdisc da classe Qdisc principal Edgard Jamhour Comandos tc: Criar a qdisc principal > tc qdisc add dev eth0 root handle 1:0 htb > tc class add dev eth0 parent 1:0 classid 1:1 htb rate 500Kbit > tc class add dev eth0 parent 1:0 classid 1:2 htb rate 300Kbit Edgard Jamhour Comandos: Criar as qdisc das classes > tc qdisc add dev eth0 parent 1:1 handle 10:0 pfifo limit 10 > tc qdisc add dev eth0 parent 1:2 handle 20:0 pfifo limit 10 > tc filter add dev eth0 parent 1:0 protocol ip u32 match ip protocol 0x06 0xff flowid 1:1 > tc filter add dev eth0 parent 1:0 protocol ip u32 match ip protocol 0x11 0xff flowid 1:2 Edgard Jamhour Seqüência de filtros u32 • Pacotes HTTP recebidos por 192.168.0.1/24 vão para classe 1:1. Os demais pacotes TCP recebidos por esse host vão para classe 1:2 tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip protocol 0x06 0xff match ip sport 80 0xfff match ip dst 192.168.0.1/24 flowid 1:1 tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip protocol 0x06 0xff match ip dst 192.168.0.1/24 flowid 1:2 Edgard Jamhour Verificando as regras com o tc • tc [-s] qdisc/class/filter show dev eth0 – mosta as qdisc/class/filter associadas a interface – –s mostra as estatísticas do uso da qdisc/class/filter • tc qdisc del root dev eth0 – limpa as regras de QoS • iplink show – mostra a classe default associada a interface Edgard Jamhour Queueing Disciplines • • • • • • • • FIFO: First In First Out SFQ: Stochastic Fair Queuing TBF: Token Bucket Flow DS_MARK: Diff-Serv Marker RED: Random Early Detection PRIO: Priority Queue [CBQ: Class-Based Queueing] = OBSOLETA HTB: Hierarquical Token Bucket Edgard Jamhour FIFO: First In First Out > tc qdisc add dev eth0 root handle 1:0 pfifo limit 10 > tc qdisc add dev eth0 parent 1:1 handle 10:0 pfifo limit 10 Edgard Jamhour PRIO: Priorização Injusta > tc qdisc add dev eth0 root handle 1:0 prio Edgard Jamhour TBF: Token Bucket Function > tc qdisc add dev eth0 root handle 1:0 prio > tc qdisc add dev eth0 parent 1:1 tbf rate 0.5mbit burst 5k latency 70ms peakrate 1mbit minburst 1500 Edgard Jamhour SFQ: Stochastic Fair Queuing > tc qdisc add dev eth0 root handle 1:0 sfq perturb 10 > tc qdisc add dev eth0 parent 1:1 handle 10:0 sfq perturb 10 Edgard Jamhour HTB: Hierarquical Token Bucket Link (3 Mbps) 200.1.2.0/24 200.1.3.0/24 Subrede A (rate 2 Mbps) (ceil 2 Mbps) telnet (rate 200 kbps) (ceil 2 Mbps) http (rate 800 kbps) (ceil 2 Mbps) outros (rate 1 Mbps) (ceil 2 Mbps) Subrede B (rate 1 Mbps) (ceil 1 Mbps) http (rate 500 kbps) (ceil 1 Mbps) outros (rate 500 kbps) (ceil 1 Mbps) > tc qdisc add dev eth0 root handle 1: htb > tc class add dev eth0 parent 1:0 classid 1:1 htb rate rate ceil rate burst bytes [ cburst bytes ] [ prio priority ] Edgard Jamhour HTB: Criação da Classes 1:0 1:1 qdisc root HTB Link (3 Mbps) 200.1.2.0/24 1:2 200.1.3.0/24 Subrede A (rate 2 Mbps) (ceil 2 Mbps) 1:3 Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:21 1:22 1:23 1:31 1:32 telnet (rate 200 kbps) (ceil 2 Mbps) http (rate 800 kbps) (ceil 2 Mbps) outros (rate 1 Mbps) (ceil 2 Mbps) http (rate 500 kbps) (ceil 1 Mbps) outros (rate 500 kbps) (ceil 1 Mbps) Edgard Jamhour HTB: Qdisc das Classes 1:0 qdisc root HTB Link (3 Mbps) 1:1 200.1.2.0/24 1:2 200.1.3.0/24 Subrede A (rate 2 Mbps) (ceil 2 Mbps) 1:3 Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:21 1:22 1:23 1:31 1:32 telnet (rate 200 kbps) (ceil 2 Mbps) http (rate 800 kbps) (ceil 2 Mbps) outros (rate 1 Mbps) (ceil 2 Mbps) http (rate 500 kbps) (ceil 1 Mbps) outros (rate 500 kbps) (ceil 1 Mbps) qdis 210:0 c FIF O 220:0 qdisc FIFO 230:0 qdisc FIFO 310:0 qdisc FIFO 320:0 qdisc FIFO Edgard Jamhour HTB: Filtros 1:0 qdisc root HTB Link (3 Mbps) 1:1 200.1.2.0/24 1:2 200.1.3.0/24 Subrede A (rate 2 Mbps) (ceil 2 Mbps) 1:3 Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:21 1:22 1:23 1:31 1:32 telnet (rate 200 kbps) (ceil 2 Mbps) http (rate 800 kbps) (ceil 2 Mbps) outros (rate 1 Mbps) (ceil 2 Mbps) http (rate 500 kbps) (ceil 1 Mbps) outros (rate 500 kbps) (ceil 1 Mbps) qdis 210:0 c FIF O filtro prio 1 220:0 qdisc FIFO filtro prio 2 230:0 310:0 qdisc FIFO qdisc FIFO filtro prio 3 filtro prio 4 320:0 qdisc FIFO filtro prio 5 Edgard Jamhour DSMARK: Marcação do Byte DS new_DS = (old_DS & mask) | value > tc qdisc add dev eth0 root handle 1:0 dsmark indices n default_index id > tc class change dev eth0 classid 1:id dsmark mask mask value value Edgard Jamhour Byte DS X DSCP para PHBs padronizados Drop Precedence DSCP em Hexa DS em Hexa Edgard Jamhour Policiamento: Policing Controle do excesso de tráfego e marcação para classe de core • Tráfego garantido: AF11 • Tráfego excedente: AF12 • Tráfego violado: DROP Roteador de borda Roteador de core > tc filter .... police rate kbit burst BYTES [reclassify | drop | continue] Edgard Jamhour Policiamento: Policing ENVIADO PARA CLASSE NORMAL ENVIADO PARA CLASSE DE TRATAMENTO DE EXCESSO e.g. AF11 e.g. AF12 rate: e.g. 500 kbps tráfego total rate: e.g. 500 kbps continue balde 1 burst: e.g. 62,5 kbytes (excesso) drop balde 2 (excesso) X drop burst: e.g. 62,5 kbytes Edgard Jamhour RED: Random Early Detection > tc qdisc add dev eth0 root handle 1:0 \ red limit <bytes> min <bytes> max <bytes> avpkt <bytes> \ burst <packets> probability <number> bandwidth <kbps> [ecn] > tc qdisc add dev eth0 parent 1:1 handle 10:0 red ... Edgard Jamhour RED: Random Early Detection descarte total para fila instantânea 256 kbytes descarte probabilístico máximo 32 kbytes descarte probabilístico variável 12 kbytes sem descarte 0 > tc qdisc add dev eth0 root handle 1:0 \ red limit 256000 min 12000 max 32000 avpkt 1000 \ burst 20 probability 0.02 bandwidth 512 ecn Edgard Jamhour Conclusão • O tc do linux apresenta um conjunto de algoritmos para controlar a forma como o tráfego é transmitido. • As políticas de QoS são feitas de forma independente para cada interface do computador/roteador • Os algoritmos de enfileiramento afetam apenas os pacotes que saem pela interface, e não os que entram. • Em um roteador, cada interface controla o QoS do tráfego em um único sentido. Edgard Jamhour