Почему этот скрипт TC не работает
Наше приложение имеет три класса трафика, и каждый тип трафика включает три порта. Мы хотим ограничить трафик по номеру порта через TC, поэтому я сделал простой сценарий TC для проведения теста, однако сценарий работает не так, как я ожидал.
Ниже приведены те команды оболочки, которые я использую для установки TC. Ожидаемый результат заключается в том, что скорость загрузки SecureCRT и Apache (SecureCRT использует 22 порта, а Apache использует 80) будет ограничена 100K/S, но реальный результат, который мы получили, заключается в том, что скорость загрузки остается неизменной - около 5 МБ / с.
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 1Mbit avpkt 1000 cell 8
tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 1Mbit rate 1Mbit
weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 1Mbit rate 1Mbit
weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
tc class add dev eth0 parent 1:0 classid 1:3 cbq bandwidth 1Mbit rate 1Mbit
weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
tc class add dev eth0 parent 1:1 classid 1:1001 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:1001 handle 1001: sfq
tc class add dev eth0 parent 1:1 classid 1:1002 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:1002 handle 1002: sfq
tc class add dev eth0 parent 1:1 classid 1:1003 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:1003 handle 1003: sfq
tc class add dev eth0 parent 1:2 classid 1:2001 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:2001 handle 2001: sfq
tc class add dev eth0 parent 1:2 classid 1:2002 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:2002 handle 2002: sfq
tc class add dev eth0 parent 1:2 classid 1:2003 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:2003 handle 2003: sfq
tc class add dev eth0 parent 1:3 classid 1:3001 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:3001 handle 3001: sfq
tc class add dev eth0 parent 1:3 classid 1:3002 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:3002 handle 3002: sfq
tc class add dev eth0 parent 1:3 classid 1:3003 cbq bandwidth 1Mbit rate
800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
tc qdisc add dev eth0 parent 1:3003 handle 3003: sfq
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport
80 0xffff flowid 1:3001
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport
22 0xffff flowid 1:3002
1 ответ
Вы не можете классифицировать трафик и затем использовать формирование или задержку на "входящем" трафике или наingress
как это часто называют. Эта диаграмма заимствована из документа LARTC:
Userspace programs
^
|
+---------------+-----------------------------------------+
| Y |
| -------> IP Stack |
| | | |
| | Y |
| | Y |
| ^ | |
| | / ----------> Forwarding -> |
| ^ / | |
| |/ Y |
| | | |
| ^ Y /-qdisc1-\ |
| | Egress /--qdisc2--\ |
--->->Ingress Classifier ---qdisc3---- | ->
| Qdisc \__qdisc4__/ |
| \-qdiscN_/ |
| |
+----------------------------------------------------------+
Linux имеет простой входной qdisc, но его возможности очень ограничены, поскольку нет входной очереди. Но можно обойти это с IMQ device
(Устройство InterMediate Queuing), которое "эмулирует" очередь на входе.
Более того, вы можете формировать / задерживать входящий трафик, когда ваш сервер работает как маршрутизатор (с включенной переадресацией IP). Если сервер имеет два сетевых интерфейса - например, eth0 для доступа в Интернет и eth1 для доступа к локальной сети - и клиент из локальной сети что-то загружает, то этот трафик является входящим / входящим на интерфейсе eth0 и исходящим / выходным на интерфейсе eth1. Поэтому, если вы определите свою политику QoS на интерфейсе eth1, она будет работать.
Наконец, я бы порекомендовал вам перейти на htb
диск из cbq
как точнее (использует TBF
или Token Bucket Filter, который не зависит от характеристик интерфейса).