Skip to main content

Настройка QoS в Open vSwitch

Данная инструкция описывает процесс настройки ограничений пропускной способности (QoS) для SAN-VLAN и основной сети на базе Open vSwitch (OVS).

Используется драйвер очередей linux-htb, позволяющий задавать максимальные скорости на уровне портов.

🟦 1. Ограничение пропускной способности SAN-порта (VLAN 25)

1.1. Создать очередь с максимальной скоростью 4.2 Гбит/с
ovs-vsctl -- --id=@q0 create queue other-config:max-rate=4509715661 \
          -- --id=@qos create qos type=linux-htb other-config:max-rate=4509715661 queues:0=@q0 \
          -- set port san25 qos=@qos

В этой команде выполняется сразу три действия:

  • создаётся очередь q0 с лимитом 4 509 715 661 бит/с;

  • создаётся объект QoS, привязанный к этой очереди;

  • QoS назначается на порт san25 (внутренний порт VLAN 25).

1.2. Проверка конфигурации SAN-QoS

Показать все политики QoS:

ovs-vsctl list qos

Показать все очереди:

ovs-vsctl list queue

Проверить настройки порта SAN-VLAN:

ovs-vsctl list port san25

2. Ограничение пропускной способности основной сети (vmbr0)

Для всех остальных сетей задаётся ограничение 1 Гбит/с.

2.1. Создать очередь и назначить QoS на vmbr0
ovs-vsctl -- --id=@q1 create queue other-config:max-rate=1073741824 \
          -- --id=@qos1 create qos type=linux-htb other-config:max-rate=1073741824 queues:0=@q1 \
          -- set port vmbr0 qos=@qos1

Создаётся:

  • очередь q1 с лимитом 1  073  741  824 бит/с;

  • объект QoS с тем же ограничением;

  • привязка QoS к порту vmbr0.

2.2. Проверка конфигурации QoS для vmbr0

Просмотр параметров порта:

ovs-vsctl list port vmbr0

Список QoS-объектов:

ovs-vsctl list qos

Список очередей:

ovs-vsctl list queue

3. Скрипт для автозапуска qos

расположение /usr/local/sbin/ovs-qos.sh:


#!/bin/bash
#Основной вариант
# Ожидание запуска Open vSwitch
for i in {1..10}; do
    ovs-vsctl show >/dev/null 2>&1 && break
    echo "OVS not ready, retrying..."
    sleep 2
done

# Если OVS так и не поднялся — выход
ovs-vsctl show >/dev/null 2>&1 || exit 1

# Проверка: существует ли уже QoS на san25
EXIST_SAN=$(ovs-vsctl get port san25 qos 2>/dev/null)
if [[ "$EXIST_SAN" == "[]" ]]; then
    echo "Applying QoS for san25..."
    ovs-vsctl -- --id=@q0 create queue other-config:max-rate=4509715661 \
        -- --id=@qos create qos type=linux-htb other-config:max-rate=4509715661 queues:0=@q0 \
        -- set port san25 qos=@qos
fi

# Проверка: существует ли QoS на vmbr0
EXIST_MGMT=$(ovs-vsctl get port vmbr0 qos 2>/dev/null)
if [[ "$EXIST_MGMT" == "[]" ]]; then
    echo "Applying QoS for vmbr0..."
    ovs-vsctl -- --id=@q1 create queue other-config:max-rate=1073741824 \
        -- --id=@qos1 create qos type=linux-htb other-config:max-rate=1073741824 queues:0=@q1 \
        -- set port vmbr0 qos=@qos1
fi

exit 0



#-------------------------------------------------------------------------------------------
#или этот

#!/bin/bash
# Скрипт для применения QoS к портам OVS после перезагрузки

# QoS для SAN сети
ovs-vsctl -- --id=@q0 create queue other-config:max-rate=4509715661 \
          -- --id=@qos create qos type=linux-htb other-config:max-rate=4509715661 queues:0=@q0 \
          -- set port san25 qos=@qos

# QoS для management сети
ovs-vsctl -- --id=@q1 create queue other-config:max-rate=1073741824 \
          -- --id=@qos1 create qos type=linux-htb other-config:max-rate=1073741824 queues:0=@q1 \
          -- set port vmbr0 qos=@qos1

exit 0

 

Сделаем скрипт исполняемым

chmod +x /usr/local/sbin/ovs-qos.sh

3.1. Создаём systemd unit

Файл: /etc/systemd/system/ovs-qos.service

[Unit]
Description=Apply OVS QoS after boot
After=network.target openvswitch-switch.service
Requires=openvswitch-switch.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/ovs-qos.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

3.2. Включаем автозапуск

systemctl daemon-reload
systemctl enable ovs-qos.service
systemctl start ovs-qos.service