Использование tc
Использование tc
Утилита tc использует средства ядра, которые активизируются посредством опций меню QoS and/or Fair Queueing. Данная программа управляет исходящим трафиком, в частности, не позволяет одному типу трафика монополизировать пропускную способность линии связи. В качестве примера рассмотрим следующую ситуацию. Предположим, что в организации имеются две подсети; каждая из них обслуживает офис, в котором работают около десяти пользователей. Если пользователи одной подсети запускают программы, генерирующие большой объем исходящих данных, производительность сетевых средств пользователей, работающих в другом офисе, может оказаться недопустимо низкой. Программа tc позволяет распределить ресурсы таким образом, что каждой из подсетей будет гарантированно выделяться часть пропускной способности линии.
Программа вызывается следующим образом:
tc [опции] объект команда
Ниже описаны элементы, передаваемые программе tc.
• опции. При вызове tc могут быть заданы опции -statistics (или -s), -details (или -d) и -raw (или -r).
• объект. Данный параметр может принимать значение qdisc, class или filter. Значение qdisc определяет порядок обслуживания, или дисциплину очереди, class задает набор пакетов, принадлежащих той или иной категории либо классу (в данном примере признаком принадлежности к классу является принадлежность к одной из подсетей), a filter генерирует правило фильтрации.
• команда. Команда — это набор параметров, которые определяют, какие действия программа tc должна выполнить с объектом. Состав команды зависит от объекта.
С помощью tc вы можете сгенерировать набор правил, описывающих сети, подключенные к компьютеру, и определяющих принцип выделения пропускной способности линии для каждой из этих сетей. Предположим, что вы хотите распределить пропускную способность линии, равную 100 Мбод, поровну между двумя подсетями, обслуживающими офисы. Предположим также, что ваш компьютер подключен к Internet посредством устройства eth0, а данные в обе подсети передаются через устройство eth1; одна из подсетей имеет IP-адрес 192.168.1.0/24, а другая — 192.168.2.0/24. Процесс настройки следует начать с определения порядка обслуживания очереди для eth1.
# tc qdisc add dev eth1 root handle 10: cbq bandwidth 100Mbit
avpkt1000
Данную команду можно условно разделить на несколько частей.
• add dev eth1. Данный компонент команды сообщает системе о том, что вы добавляете дисциплину очереди для eth1.
• root. В некоторых случаях дисциплины могут составлять деревья. Этот параметр указывает на создание корневого узла нового дерева.
• handle 10. Этот компонент команды определяет метку (handle) для дисциплины.
• cbq. Вам необходимо сообщить системе, какой метод организации очереди должен быть использован. Метод CBQ (Class-Based-Queueing — очередь на базе классов) применяется чаще всего. Данный параметр отражается в имени одной из опций ядра в меню QoS and/or Fair Queueing.
• bandwidth 100Mbit. С помощью данного компонента вы сообщаете системе о пропускной способности линии. Если различные интерфейсы маршрутизатора подключены через линии с разной пропускной способностью, задается наименьшее значение.
• avpkt 10 0 0. По сети могут передаваться пакеты различного размера, но, для того, чтобы планировать использование линии, система должна иметь хотя бы приблизительное представление о том, какими могут быть размеры пакетов. Конкретное значение данного параметра может отличаться от указанного здесь.
Теперь надо определить классы для сети и для каждой из подсетей. Для этого используются команды наподобие следующей:
# tc class add dev eth1 parent 10:0 classid 10:1 cbq
bandwidth 100Mbit rate 100Mbit allot 1514 weight 10Mbit
prio 8 maxburst 20 avpkt 1000
Эта команда похожа на предыдущую, но она создает класс, определяющий одну из двух сетей. Обратите внимание на то, что данный класс задается для использования всей доступной пропускной способности. Впоследствии этот ресурс будет разделен между подсетями. В отличие от предыдущей команды, некоторые параметры изменены, кроме того, в состав этой команды входят дополнительные компоненты.
• class. Если в предыдущей команде был задан объект qdisc, то здесь присутствует объект class, определяющий класс.
• parent 10:0. Этот компонент команды задает корень дерева. К метке, определенной в предыдущей команде, добавляется значение 0.
• classid 10:1. Данный компонент задает идентификатор конкретного класса.
• allot 1514. С помощью этого параметра указывается значение MTU для сети (оно на несколько байт превышает реальное значение).
• weight 1Mbit. Данный параметр используется для настройки. Возможно, для конкретной сети необходимо специально подобрать его значение.
• prio 8. Этот компонент команды задает приоритет правила. Чем больше значение, тем выше приоритет.
Правила для подсетей задаются с помощью команд, подобных рассмотренной выше.
# tc class add dev eth1 parent 10:1 classid 10:100 cbq
bandwidth 100Mbit rate 50Mbit allot 1514 weight 5Mbit
prio 5 maxburst 20 avpkt 1000 bounded
# tc class add dev eth1 parent 10:1 classid 10:200 cbq
bandwidth 100Mbit rate 50Mbit allot 1514 weight 5Mbit
prio 5 maxburst 20 avpkt 1000 bounded
Эти команды различаются только значением classid. Обе ссылаются на корневой класс, и каждая выделяет соответствующей подсети 50 Мбод пропускной способности линии. (Вы можете задать разные значения для каждой подсети, например 60 Мбод и 40 Мбод.) Параметр bounded указывает на то, что система не должна выделять классу часть пропускной способности линии, превышающую указанное значение. Часто такое ограничение бывает нежелательным, поскольку если из одной сети данные не передаются, другая сеть не сможет использовать остальную часть пропускной способности линии. Отказавшись от параметра bounded, вы обеспечите большую гибкость при работе через линии связи, в частности, предоставите офисам возможность "занимать" друг у друга пропускную способность линии. Если же обоим офисам потребуется передавать данные, этот ресурс будет распределен поровну.
Теперь необходимо связать дисциплину очереди с каждым из двух классов.
# tc qdisc add dev eth1 parent 10:100 sfq quantum 1514b
perturb 15
# tc qdisc add dev eth1 parent 10:200 sfq quantum 1514b
perturb 15
Данные команды аналогичны рассмотренной ранее команде, определяющей порядок обслуживания очереди. Они сообщают Linux о том, что для планирования трафика внутри подсети каждого офиса должна использоваться дисциплина SFQ (Stochastic Fairness Queueing — стохастическая организация очереди, обеспечивающая равный доступ). Эта дисциплина популярна, так как для ее реализации не требуется много ресурсов процессора. Если понадобится, можете задать другую дисциплину.
Команды, которые мы уже рассмотрели, не предоставляли ядру информацию, позволяющую разделить трафик, соответствующий различным подсетям (192.168.1.0/24 и 192.168.2.0/24). Поэтому необходимо выполнить следующие команды:
# tc filter add dev eth1 parent 10:0 protocol ip prio 100 u32
match ip dst 192.168.1.0/24 flowid 10:100
# tc filter add dev eth1 parent 10:0 protocol ip prio 100 u32
match ip dst 192.168.2.0/24 flowid 10:200
В отличие от предыдущих, в этих командах указан объект filter. Данные команды задают правила, которые связывают трафик подсети с соответствующим классом. Обоим правилам назначены одинаковые приоритеты и задан алгоритм u32, работающий с блоками IP-адресов.
Созданные правила управляют потоком данных из Internet в локальные сети. При желании вы можете создать аналогичный набор правил, действующих в противоположном направлении. Эти правила почти совпадают с предыдущими, но вместо внутреннего интерфейса eth1 они должны ссылаться на внешний интерфейс eth0, и в двух последних командах filter вместо параметра dst должен быть указан параметр src.