Рубрики
ovs / openvswitch / dpdk

ovs / openvswitch

ссылки:

https://www.openvswitch.org/
https://docs.openvswitch.org/en/latest/faq/issues/
https://www.openvswitch.org/support/dist-docs/ovs-vswitchd.conf.db.5.html
https://docs.openvswitch.org/en/latest/intro/install/dpdk/
https://habr.com/ru/companies/intel/articles/309836/

Информация о бридже:

ovs-vsctl show
ovs-vsctl list port
ovs-ofctl show ovsbr0

Создание бриджа и добавление сетевой карты:

ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 eth0
ovs-vsctl add-port ovsbr0 eth1
ovs-vsctl add-port ovsbr0 wlan0

Назначение IP адреса на бридж:

ip addr flush dev eth0
ip addr add 192.168.128.5/24 dev ovsbr0
ip link set ovsbr0 up

Создание бриджа ovsbr0 и сделать bond:

ovs-vsctl add-br ovsbr0
ovs-vsctl add-bond ovsbr0 bond0 eth0 eth1
#mode  active-backup, balance-slb, or balance-tcp
ovs-vsctl add-bond ovsbr0 bond0 eth1 eth2 bond_mode=active-backup

Включить STP:

ovs-vsctl add-br ovsbr0
ovs-vsctl set bridge ovsbr0 stp_enable=true
ovs-vsctl add-port ovsbr0 eth0
ovs-vsctl add-port ovsbr0 eth1

Создание внутреннего устройства:

!!! так работать не будет:
## tunctl -t tap0
## ip addr add 192.168.0.123/24 dev tap0
## ip link set tap0 up
## ovs-vsctl add-br br0
##ovs-vsctl add-port br0 tap0

Почему:
Ответ в том, что Open vSwitch перехватывает только полученные пакеты, но это уже передаваемый пакет. 
То же самое происходит и со всеми остальными типами сетевых устройств, кроме «внутренних» портов Open vSwitch. 
Если вы, например, добавите физический порт Ethernet к мосту OVS, настроите IP-адрес на физическом порту Ethernet, 
а затем отправите «ping» на адрес в этой подсети, произойдет то же самое: 
ARP будет передан на физический порт Ethernet и Open vSwitch его никогда не видят.
Обратите внимание, что в таком случае на «отводном» устройстве не настраивается IP-адрес
(обычно IP-адрес настроен в виртуальном сетевом адаптере внутри виртуальной машины, но он не виден ядру хоста Linux или Open vSwitch).

А вот так все заработает:
ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 int0 -- set Interface int0 type=internal
ip addr add 192.168.0.123/24 dev int0
ip link set int0 up

Потеря пакетов в начале тестов RFC2544

В случае OVS кэш очищается быстро, и чтобы учесть задержку генератора трафика между фазой обучения и тестирования, 
настройки максимального времени ожидания простоя следует изменить на 50000 мс:
ovs-vsctl --no-wait set Open_vSwitch . other_config:max-idle=50000

MTU

Установить mtu:
ovs-vsctl set int ovsbr0 mtu_request=1450

Вернуть mtu по умолчанию:
ovs-vsctl set int br0 mtu_request=[]

Добавление VLAN

Одним из больших плюсов работы с OpenVSwitch является поддержка VLAN. 
Для этого нужно обозначить теги на виртуальных портах и настроить сетевую карту как транковый интерфейс.

Создадим новый виртуальный коммутатор:
ovs-vsctl add-br ovsbr0

Добавляем реальную сетевую карту к виртуальному коммутатору:
ovs-vsctl add-port ovsbr0 eth0

Делаем порт коммутатора транковым и описываем теги, которые будут проходить через коммутатор:
ovs-vsctl set port eth0 trunks=10,20,300,400,1000

Добавляем виртуальный сетевой интерфейс и присваиваем ему тег:
ovs-vsctl add-port ovsbr0 testvlan20 tag=20 -- set interface testvlan20 type=internal

Теперь можно посмотреть конфигурацию:
ovs-vsctl show

Еще примеры:
обычное использование без vlan:
ovs-vsctl show - показывает информацию по свитчу, проверяем работу и заодно узнаем какая у нас версия ovs
ovs-vsctl add-br br0 - добавляем свитч с именем br0
ovs-vsctl add-port br0 eth0 - добавляем интерфейс eth0 в свитч br0 
 
пример с vlan:
ovs-vsctl add-br ovs0 - добавляем свитч openvswitch с именем br0
ovs-vsctl add-port ovs0 eth0 - добавляем интерфейс eth0 в свитч ovs0 
ovs-vsctl set port eth0 vlan_mode=native-untagged tag=2 trunks=2,3,4 - вешаем trunk на интерфейс eth0 
ovs-vsctl add-port ovs0 ovs0-vlan2 tag=2 -- set Interface ovs0-vlan2 type=internal - добавляем порт и вешаем access (tag=2) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan4 tag=4 -- set Interface ovs0-vlan4 type=internal - добавляем порт и вешаем access (tag=4) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan3 tag=3 -- set Interface ovs0-vlan3 type=internal - добавляем порт и вешаем access (tag=3) на интерфейс ovs0-vlan2
 
ovs-vsctl set port ovsbr0 tag=29
 
удаление портов и коммутатора:
ovs-vsctl del-port ovs0-vlan2 - удалить порт (ovs0-vlan2) из коммутатора
ovs-vsctl del-br ovs0 - удалить коммутатор ovs0

Включение Netflow на виртуальном коммутаторе OpenVSwitch:

Если возникает необходимость вести учет сетевого трафика, проходящего через интерфейсы, 
то заставить OpenVSwitch отправлять пакеты Netflow на адрес коллектора можно одной командой:
ovs-vsctl -- set Bridge ovsbr0 netflow=@nf -- --id=@nf create NetFlow targets="IP_ADDRESS:PORT" active-timeout=30

Изменить время:
ovs-vsctl set Netflow ovsbr0 active_timeout=60

Чтобы прекратить отправлять данные на Netflow коллектор, достаточно очистить настройки Netflow для виртуального коммутатора:
ovs-vsctl clear Bridge ovsbr0 netflow

dpdk

Выделение памяти:
numa0 mem:
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"
или numa
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024"

Выделение процессоров:
Установленный бит в маске означает, что поток pmd создается и закрепляется за соответствующим ядром ЦП. 
Например, чтобы запустить потоки pmd на ядрах 1 и 2:
ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x6

Проверка доступности dpdk:
ovs-vsctl get Open_vSwitch . dpdk_initialized

Проверка версии ovs:
ovs-vswitchd --version

Проверка версии dpdk:
ovs-vsctl get Open_vSwitch . dpdk_version "DPDK 17.11.0"

Добавление сетевых карт в бридж ovs dpdk:
ovs-vsctl add-br ovsbr0 -- set bridge br0 datapath_type=netdev
ovs-vsctl add-port ovsbr0 eth0_name -- set Interface myportnameone type=dpdk options:dpdk-devargs=0000:06:00.0
ovs-vsctl add-port ovsbr0 eth1_name -- set Interface myportnametwo type=dpdk options:dpdk-devargs=0000:06:00.1

Очереди dpdk:
ovs-vsctl set Interface  options:n_rxq=
ovs-vsctl set Interface dpdk0 options:n_rxq_desc=
ovs-vsctl set Interface dpdk0 options:n_txq_desc=
Различные конфигурации n_rxq_desc и n_txq_desc дают разные преимущества с точки зрения пропускной способности и задержки для разных сценариев. 
Как правило, меньшие размеры очередей могут оказать положительное влияние на задержку за счет пропускной способности. 
Обратное часто справедливо для очередей большего размера. 
Примечание. Увеличение количества дескрипторов rx, например. до 4096 может отрицательно повлиять на производительность из-за того, 
что могут использоваться невекторизованные функции DPDK rx. 
Это зависит от используемого драйвера, но справедливо для часто используемых драйверов DPDK i40e и ixgbe.

Ограничения скорости / шейпер


ovs-vsctl set interface vhost-user1 ingress_policing_rate=10000 ingress_policing_burst=1000

ingress_policing_rate: максимальная скорость (Кбит/с), разрешенная для этой виртуальной машины. 
Это значение обязательно для создания ограничителя входящего трафика. 
Если значение не указано, существующая настройка ограничения скорости останется без изменений.

ingress_policing_burst: размер буфера маркеров в килобайтах. 
Минимальное значение этого параметра должно быть равно наибольшему предполагаемому размеру пакета. 
Если значение не указано, используется значение по умолчанию, равное 8000 КБ.


Существующую настройку ограничения скорости для vhost-user1 можно получить с помощью следующей команды:
ovs-vsctl list interface vhost-user1

Чтобы отменить ограничения скорости трафика vhost-user1, установите для параметра ingress_policing_rate значение 0, 
как показано ниже (настраивать значение параметра ingress_policing_burst не нужно):
ovs-vsctl set interface vhost-user1 ingress_policing_rate=0