Вопрос или проблема
Я использую OVS и Mininet для некоторых экспериментов. При добавлении ссылок в Mininet, используя параметры bw, max_queue_size и другие настройки, связанные со ссылками, фактически используется TC под капотом. Теперь я добавляю небольшое изменение в код, чтобы иметь возможность добавлять подсистемы с TC для родительской очереди, контролируя пропускную способность.
cmds += [
f"tc class add dev %s parent 5:1 classid 5:10 htb rate {bw // 2}Mbit ceil {bw} prio 7", # по умолчанию
f"tc class add dev %s parent 5:1 classid 5:20 htb rate {bw bw //4}Mbit ceil {bw} prio 1", # высокая приоритетность
"tc qdisc add dev %s parent 5:10 handle 10: htb",
"tc qdisc add dev %s parent 5:20 handle 20: htb",
]
Код для создания родительской очереди
cmds += [ 'tc qdisc add dev %s root handle 5:0 htb default 10',
f'tc class add dev %s parent 5:0 classid 5:1 htb rate {bw}Mbit burst 15k']
Теперь, после создания этих двух подсистем, я хочу привязать их к очередям OVS. Единственный способ, который я нашел, это
cmd = (f"ovs-vsctl -- set port %s qos=@newqos "
f"-- --id=@newqos create qos type=linux-htb other-config:max-rate={max_rate} queues=10=@q0,20=@q1 "
f"-- --id=@q0 create queue other-config:min-rate={min_rate} other-config:max-rate={max_rate} other_config:priority=7 "
f"-- --id=@q1 create queue other-config:min-rate={min_rate} other-config:max-rate={max_rate} other_config:priority=1")
Самая команда OVS использует TC под капотом, который переопределяет оригинально созданные очереди для интерфейса. Есть ли какие-либо предложения по созданию очередей в OVS, но с использованием уже созданных очередей с TC?
Спасибо
Ответ или решение
Создание и управление очередями в Open vSwitch (OVS) с использованием Traffic Control (TC) – это важная задача для оптимизации сетевой производительности. Ваша цель заключается в том, чтобы интегрировать уже созданные очереди с TC в OVS, используя базовые механизмы управления пропускной способностью и приоритетами трафика.
Шаг 1: Создание родительской очереди с TC
Для начала вы уже правильно создали родительскую очередь с использованием команды TC. Как видно из вашего кода:
cmds += [ 'tc qdisc add dev %s root handle 5:0 htb default 10',
f'tc class add dev %s parent 5:0 classid 5:1 htb rate {bw}Mbit burst 15k']
Здесь вы создаете распределение пропускной способности для интерфейса с помощью HTB (Hierarchical Token Bucket). Не забудьте заменить %s
на имя вашего сетевого интерфейса.
Шаг 2: Создание подочередей
Вы правильно создали подочереди. Тем не менее, необходимо обратить внимание на корректность задания параметров, чтобы они не влияли на родительскую очередь. Ваше использование команды:
cmds += [
f"tc class add dev %s parent 5:1 classid 5:10 htb rate {bw // 2}Mbit ceil {bw} prio 7", # default
f"tc class add dev %s parent 5:1 classid 5:20 htb rate {bw // 4}Mbit ceil {bw} prio 1", # high prio
"tc qdisc add dev %s parent 5:10 handle 10: htb",
"tc qdisc add dev %s parent 5:20 handle 20: htb",
]
здесь все выглядит правильно. Вы можете дополнительно регулировать значения rate
и ceil
в зависимости от ваших потребностей и целей эксперимента.
Шаг 3: Интеграция с OVS
Для интеграции созданных очередей TC с OVS есть несколько подходов. Проблема, с которой вы столкнулись, заключается в том, что OVSQos переопределяет политики, созданные через TC. Чтобы избежать этого, необходимо использовать механизм "обертки" или "передачи".
Рекомендуется применять такую конструкцию:
- Создание OVS QoS и привязка к существующим очередям TC:
Чтобы создать экземпляр QoS в OVS и привязать его к уже созданным очередям TC, используйте следующую команду:
cmd = (f"ovs-vsctl -- set port %s qos=@newqos "
f"-- --id=@newqos create qos type=linux-htb other-config:max-rate={max_rate} "
f"queues=10=@q0,20=@q1 "
f"-- --id=@q0 create queue other-config:min-rate={min_rate} other-config:max-rate={max_rate} other_config:priority=7 "
f"-- --id=@q1 create queue other-config:min-rate={min_rate} other-config:max-rate={max_rate} other_config:priority=1")
- Подход "обертывания" для предотвращения переопределения:
Если Qos в OVS автоматически переопределяет задаваемые вами TC параметры, вам следует реализовать механизм "обертывания", который добавит поддерживающую логику. Такой подход позволяет сохранить управление очередями.
Заключение
Для успешного управления очередями OVS с уже созданными очередями TC необходимо учитывать взаимодействие между OVS и TC. Используйте предоставленный алгоритм интеграции и корректируйте параметры в зависимости от необходимых требований вашей сети. Не забывайте тестировать каждую настройку, чтобы удостовериться в ее эффективности и корректности функционирования.
Кроме того, избегайте конфликта настроек, в противном случае ваши усилия по оптимизации могут быть сведены на нет. Разработка и тестирование сети – это итеративный процесс, требующий внимания к деталям и готовности вносить изменения по мере необходимости.