trafic control (tc) - один из самых труднопонимаемых для меня инструментов. Помогите, пожалуйста, разобраться.
Из того, что нашарил в рунете, самые вменяемые для понимания статьи:
http://www.xakep.ru/post/49421/default.asp?print=true
http://unixforum.org/index.php?showtopic=123039
На сколько я понял, в tc cуществуют очереди, классы и фильтры. Очереди - это компоненты ядра, ответственные за очерёдность прохождения пакетов. Пакеты в очереди можно задерживать - это и есть шейпинг.
Просматриваю очереди пакетов на сервере:
gadminko@gate:~$ sudo tc qdisc show
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: dev eth1 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: dev eth2 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
adminko@gate:~$ sudo tc qdisc add dev eth0 root handle 1: htb default 20
adminko@gate:~$ sudo tc qdisc add dev eth1 root handle 1: htb default 20
adminko@gate:~$ sudo tc qdisc add dev eth2 root handle 1: htb default 20
adminko@gate:~$ sudo tc class add dev eth0 parent 1: classid 1:1 htb 100mbps ceil 100mbps
adminko@gate:~$ sudo tc class add dev eth1 parent 0: classid 1:1 htb 100mbps ceil 100mbps
adminko@gate:~$ sudo tc class add dev eth2 parent 0: classid 1:1 htb 100mbps ceil 100mbps
И тут возникает первый вопрос: почему при подключении очередей htb мы указали умолчальный класс 20, но последующие команды описывают классы с хэндлом 1:1, а не 1:20?
Дальше, смотрим что получилось:
adminko@gate:~$ sudo tc qdisc show
qdisc htb 1: dev eth0 root refcnt 2 r2q 10 default 20 direct_packets_stat 142
qdisc htb 1: dev eth1 root refcnt 2 r2q 10 default 20 direct_packets_stat 332
qdisc htb 1: dev eth2 root refcnt 2 r2q 10 default 20 direct_packets_stat 42
adminko@gate:~$ sudo tc class show dev eth0
class htb 1:1 root prio 0 rate 800000Kbit ceil 800000Kbit burst 1600b cburst 1600b
adminko@gate:~$ sudo tc class show dev eth1
class htb 1:1 root prio 0 rate 800000Kbit ceil 800000Kbit burst 1600b cburst 1600b
adminko@gate:~$ sudo tc class show dev eth2
class htb 1:1 root prio 0 rate 800000Kbit ceil 800000Kbit burst 1600b cburst 1600b
Собственно вопросы: почему 800000Kbit, а не 100000 и даже не 102400? Что такое: ceil, burst, cburst, refcnt, r2q?
Теперь о задачах. eth0 - это Интернет, к eth1 подключены отделы, к eth2 - арендаторы. Задача - арендаторам сделать трафик 10Мбит/c, отделам - 5Мбит/c, привелегированным отделам - 30Мбит/с.
adminko@gate:~$ sudo tc class add dev eth2 parent 1:1 classid 1:14 htb rate 10mbps
adminko@gate:~$ sudo tc qdisc add dev eth2 parent 1:14 handle 40:0 sfq perturb 10
adminko@gate:~$ sudo tc filter add dev eth2 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.48.0/24 flowid 1:14
Вопросы: почему класс 1:14 должен являться дочерним классом класса 1:1, а не расти из корня 1:0?
Зачем тут вообще «tc qdisc add», и как она имея мажорный номер 0, может находиться под классом 1:14, ведь очереди - это самый высший уровень иерархии?