Назад | Перейти на главную страницу

Почему этот скрипт TC не работает

В нашем приложении есть три класса трафика, и каждый тип трафика включает три порта. Мы хотим ограничить трафик по номеру порта через TC, поэтому я сделал простой сценарий TC для тестирования, однако сценарий работает не так, как я ожидал.

Ниже приведены команды оболочки, которые я использую для установки TC. Ожидаемый результат заключается в том, что скорость загрузки SecureCRT и Apache (SecureCRT использует 22 порта, а Apache использует 80) будет ограничена 100 КБ / с, но фактический результат, который мы получили, таков: скорость загрузки остается неизменной - около 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

Вы не можете классифицировать трафик, а затем использовать формирование или задержку на "входящий" трафик или на ingress как это часто называют. Эта диаграмма заимствована из Документ LARTC:

 Userspace programs
                     ^
                     |
     +---------------+-----------------------------------------+
     |               Y                                         |
     |    -------> IP Stack                                    |
     |   |              |                                      |
     |   |              Y                                      |
     |   |              Y                                      |
     |   ^              |                                      |
     |   |  / ----------> Forwarding ->                        |
     |   ^ /                           |                       |
     |   |/                            Y                       |
     |   |                             |                       |
     |   ^                             Y          /-qdisc1-\   |
     |   |                            Egress     /--qdisc2--\  |
  --->->Ingress                       Classifier ---qdisc3---- | ->
     |   Qdisc                                   \__qdisc4__/  |
     |                                            \-qdiscN_/   |
     |                                                         |
     +----------------------------------------------------------+

В Linux есть простой Ingres qdisc, но его возможности очень ограничены, так как нет входной очереди. Но можно обойти это с помощью IMQ device (InterMediate Queuing device), которое «имитирует» организацию очереди на входе.

Более того, вы можете формировать / задерживать входящий трафик, когда ваш сервер действует как маршрутизатор (с включенной переадресацией IP). Если у сервера есть два сетевых интерфейса - например, eth0 для доступа в Интернет и eth1 для доступа к локальной сети - если клиент из локальной сети что-то загружает, то этот трафик является входящим / входящим на интерфейсе eth0 и исходящим / исходящим на интерфейсе eth1. Итак, если вы определите свою политику QoS на интерфейсе eth1, она будет работать.

Наконец, я бы порекомендовал вам перейти на htb qdisc из cbq как более точный (он использует TBF или Token Bucket Filter, который не зависит от характеристик интерфейса).