Sieci w Linuksie/iproute2/tc/qdisc
Polecenie tc qdisc służy do dodawania i zarządzania dyscyplin kolejkowania w interfejsach sieciowych. Składnia polecenia wyświetlana przez polecenie `tc qdisc help` jest następująca:
Składnia i opcje polecenia
edytujUsage: tc qdisc [ add | del | replace | change | show ] dev STRING [ handle QHANDLE ] [ root | ingress | parent CLASSID ] [ estimator INTERVAL TIME_CONSTANT ] [ stab [ help | STAB_OPTIONS] ] [ [ QDISC_KIND ] [ help | OPTIONS ] ] tc qdisc show [ dev STRING ] [ingress] Where: QDISC_KIND := { [p|b]fifo | tbf | prio | cbq | red | etc. } OPTIONS := ... try tc qdisc add <desired QDISC_KIND> help STAB_OPTIONS := ... try tc qdisc add stab help
Typy dyscyplin
edytujhtb
edytujNazwa tej dyscypliny jest skrótem ang. Hierarchy Token Bucket (hierarchia wiaderek żetonów). Mechanizm HTB pozwala zarówno na kształtowanie jak i szeregowanie transmisji. Jego budowa opiera się na drzewiastej strukturze, w której każdy węzeł ma przypisaną na sztywno minimalną gwarantowaną przepustowość oraz maksymalną przepustowość. Dzieci mogą pożyczać od siebie przepustowość w ramach maksymalnej przepustowości rodzica, aż do osiągnięcia własnej maksymalnej przepustowości.
- Składnia
tc qdisc ... dev DEV ( parent CLASSID | root) [ handle MAJOR: ] htb [ default MINOR-ID ] tc class ... dev DEV parent MAJOR:[MINOR] [ classid MAJOR:MINOR ] htb rate RATE [ ceil RATE ] burst BYTES [ cburst CBYTES ] [ prio PRIORITY ]
- rate RATE - minimalna gwarantowana przepustowość
- ceil RATE - maksymalna gwarantowana przepustowość (wartością domyślną jest wartosć rate, co oznacza brak pożyczania)
- burst BYTES - maksymalna szczytowa przepustowość ponad rate
- cburst CBYTES -
- prio PRIORITY - priorytet kolejki (im niższa liczba, tym wyższy priorytet)
- Przykład
tc qdisc add dev ifb5 handle 1:0 root htb default 100 # 1 tc class add dev ifb5 classid 1:1 parent 1: htb rate 20Mbit ceil 20Mbit # 2 tc class add dev ifb5 classid 1:100 parent 1:1 htb prio 3 rate 15Mbit ceil 18Mbit # 3 tc class add dev ifb5 classid 1:101 parent 1:1 htb prio 1 rate 512kbit ceil 1Mbit # 4 tc class add dev ifb5 classid 1:102 parent 1:1 htb prio 2 rate 15Mbit ceil 18Mbit # 5 tc class add dev ifb5 classid 1:103 parent 1:1 htb prio 2 rate 15Mbit ceil 18Mbit # 6
Powyższe polecenia tworzą 4 kolejki o zadanych przepustowościach i priorytetach. Aby jednak całość działała potrzebne są jeszcze filtry, które będą klasyfikowały pakiety do poszczególnych kolejek.
tc filter add dev ifb5 pref 1 protocol ip parent 1:0 u32 match ip src 192.168.0.0/24 classid 1:101 tc filter add dev ifb5 pref 1 protocol ip parent 1:0 u32 match ip dst 172.17.1.0/24 classid 1:102 tc filter add dev ifb5 pref 1 protocol ip parent 1:0 u32 match ip dst 172.17.2.0/24 classid 1:103 tc filter add dev ifb5 pref 1 protocol ip parent 1:0 u32 match ip dst 172.17.3.0/24 classid 1:103
pfifo_fast
edytujJest to domyślna dyscyplina dla wszystkich interfejsów sieciowych. Realizuje ona proste szeregowanie za pomocą 3 kanałów o malejącym priorytecie (kanały te są bezklasowe, co oznacza, że dyscyplina ta nie może posiadać potomków). Każdy kanał może wysyłać pakiety gdy kanał o wyższym priorytecie jest pusty. Jeżeli z interfejsu skasuje się drzewo dyscyplin ustawiana jest automatycznie dyscyplina pfifo_fast.
tc-pfifo_fast(8)
– strona podręcznika systemu Linux
sfq
edytujNazwa dyscypliny jest skrótem od ang. Stochastic Fairness Queueing, która oznacza stochastyczne kolejkowanie sprawiedliwe. Dyscyplina ta jest bezklasowa, nie może posiadać potomków. Działanie jej opiera się na dynamicznym tworzeniu kanałów i przyporządkowywaniu im pakietów na podstawie hashy obliczanych na podstawie adresu źródłowego, adresu docelowego i numeru portu (dla protokołów TCP, UDP), lub innych parametrów (dla protokołów bezportowych). Następnie kanały te są opróżniane według algorytmu round-robin. Ponieważ kilka połączeń może wylądować w tym samym kanale rodzi to niesprawiedliwość, dlatego sfq posiada parametr perturb, który oznacza liczbę sekund, po upływie których nastąpi ponowne obliczenie hashy (z inną wartością ziarna), jednak powoduje to zmianę kolejności pakietów, dlatego wartość ta nie powinna być zbyt niska (domyślna wartość to 0, która oznacza brak perturbacji). Dodatkowym parametrem jest quantum, który oznacza ile bajtów należy zdjąć z każdej kolejki w czasie przetwarzania pojedynczej iteracji algorytmu RR.
- Składnia
... sfq [perturb seconds] [quantum bytes]
tc-sfq(8)
– strona podręcznika systemu Linux